60D3 – list 和 tuple 的基本操作、深浅拷贝、切片操作等5个方面的总结

元组

元组既然是不可变(immutable)对象,自然也就没有增加、删除元素的方法。

基本操作

使用一对括号( ) 就能创建一个元组对象,如:

a = () # 空元组对象
b = (1,'xiaoming',29.5,'1731222222')
c = ('001','2019-11-11',['三文鱼','哦依稀'])

它们都是元组,除了 list 是用 [ ] 创建外,其他都与 list 很相似,比如都支持切片操作。

特别注意:一个整数加一对括号,比如 (10),返回的是整数。必须在整数后加一个逗号才会返回为元组对象 (10,)。

列表和元组都有一个很好用的统计方法 count,实现对某个元素的个数统计:

from numpy import random
a = random.randint(1,5,10) # 从 [1,5) 区间内随机选择 10 个数
at = tuple(a) # 转 tuple:(1, 4, 2, 1, 3, 3, 2, 3, 4, 2)
at.count(3) # 统计 3 出现次数,恰好也为 3 次

可变与不可变

列表是一个可变容器,可变与不可变是一对很微妙的概念。

我们先创建一个列表 a,其中,新创建的列表在索引 2 处还是一个列表(list)。

我们可以使用 a.pop() 删除最后一个元素。删除后我们还可以使用 a.insert() 在某个索引位置添加一个元素。(a.insert(1,2) 在索引 1 处添加一个元素 2。)
因此,对列表而言,因为它可以增加或删除元素,所以它是可变的。

但是,如果仅仅在列表 a 中做这一步操作:

a[2].insert(1,6) #在 a[2](也是一个列表)中插入元素 6  

那么插入后便成了这样:

对于 可变 这个概念而言,这就不是真正调整a为 可变 的操作。

tuple 就是一个典型的不可变容器对象。对它而言,同样也可以修改嵌套对象的取值,但这并没有真正改变 tuple 内的元素。

如下所示,有一个元组 a:

a =(1,3,[5,7],9,11,13)

a 的存储示意图如下:

下面插入一个元素 6:

a[2].insert(1,6)

可以看到,a 内元素没增没减,长度还是 6:

这就是不可变对象的本质,元组一旦创建后,长度就被唯一确定。

但是,对于 list 而言,列表长度会有增有减,所以它是可变的。

页面: 1 2 3

《60D3 – list 和 tuple 的基本操作、深浅拷贝、切片操作等5个方面的总结》有2个想法

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注