Golang与Python 数组和切片

背景

第一次接触到数组和切片的概念是在Python中。Python极其强大的切片操作,让我自然而然的面对Golang时,直接生搬硬套进去了。然后发现在一些场景下的结果不及预期,所以就好好查了一下,Golang的切片底层实现。

数组与切片

什么是数组(Array)?

在计算机科学中,数组数据结构(英语:array data structure),简称数组(英语:Array),是由相同类型的元素(element)的集合所组成的数据结构,分配一块连续的内存来存储。利用元素的索引(index)可以计算出该元素对应的存储地址。 维基百科

什么是切片(Slice)?

在计算机编程中,数组切片是一种从数组中提取元素子集并将其打包为另一个数组的操作,可能与原始数组的维数不同。数组切片的常见示例是从字符串中提取子字符串,“ hello”中的“ ell”,从二维数组中提取行或列,或者从矩阵中提取向量。根据编程语言的不同,数组切片可以由非连续元素组成。 同样取决于语言,新数组的元素可以被别名为原始数组的元素(即与之共享内存)。维基百科。也就是说切片其实是数组的衍生概念。没有数组就不会有切片了。

Python的数组

在Python中并没有数组的概念,取之代替的是list和tuple。tuple(元组)在这里不细讲了。
list本质是一个链表,我们可以对list做很多操作,以下是简单遍历打印

a = [1,2,3,4,5]
[print(i) for i in a]

对list进行扩容,Python为list本身提供了很多的内置函数 append() count() insert() reverse() clear() extend() pop() sort() copy() index() remove()具体可以查看Python的文档,就不赘述了。

a = [1,2,3,4,5]
a.append(6)
a.append(7)
print(a)

Python的切片操作

Python提供了切片(Slice)操作符,主要用于对下标操作的时候。简化对数组的操作。每一个切片返回的数据都是原数组的一个副本。不会对原数组有影响。切片操作在函数上体现的是[start,stop,step],也就是说,
start是切片的起始位置
stop是切片的结束位置(不包括)
step可以不提供,默认值是1,步长不能为0,否则会报错。

a = [1,2,3,4,5]
a[0:3]
a[0:-1]
a[2:4:2]

Golang的数组与切片

Golang本身是支持数组类型的,Golang的数组类型如下表示。声明必须指定长度和类型。

[20]int
[100]interface{}

Golang的切片,切片的长度是动态,声明无需指定长度。

[]int
[]interface{}

切片的初始化,有三种方式:
1.通过下标的方式获得数组或者切片的一部分;
2.使用字面量初始化新的切片;
3.使用关键字 make 创建切片:

arr[0:3]
slice := []int{1, 2, 3}
slice := make([]int, 10)

与Python完全不一样的是,切片并不存储任何数据,它只是描述了底层数组中的一段。更改切片的元素会修改其底层数组中对应的元素。与它共享底层数组的切片都会观测到这些修改。底层是通过指针+len+cap实现的。

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

weixin_39092993

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值