下列语句执行后,S值为
S= [ 1,2,3,4,5,6]
s[:1]=[]
s[:2]='a'
s[2:]='b'
S[2:3]=['x",'y']
del s [: 1]
(关于元组与列表方面的问题解答)
[4, 'x', 'y']
列表是动态的、可变的,而元组是静态的、不可变的。这样的差异,势必会影响两者存储方式。
l = [1, 2, 3]
l.__sizeof__()
64
tup = (1, 2, 3)
tup.__sizeof__()
48
列表是动态的,所以它需要存储指针,来指向对应的元素(上述例子中,对于 int 型,8 字节)。另外,由于列表可变,所以需要额外存储已经分配的长度大小(8 字节),这样才可以实时追踪列表空间的使用情况,当空间不足时,及时分配额外空间。
通过一个例子,来描述列表空间分配的过程。
l = []
l.__sizeof__() // 空列表的存储空间为40字节
40
l.append(1)
l.__sizeof__()
72 // 加入了元素1之后,列表为其分配了可以存储4个元素的空间 (72 - 40)/8 = 4
l.append(2)
l.__sizeof__()
72 // 由于之前分配了空间,所以加入元素2,列表空间不变
l.append(3)
l.__sizeof__()
72 // 同上
l.append(4)
l.__sizeof__()
72 // 同上
l.append(5)
l.__sizeof__()
104 // 加入元素5之后,列表的空间不足,所以又额外分配了可以存储4个元素的空间
可以看到,为了减小每次增加 / 删减操作时空间分配的开销,Python 每次分配空间时都会额外多分配一些,这样的机制(over-allocating)保证了其操作的高效性:增加 / 删除的时间复杂度均为O(1)O(1)O(1)。
对于元组,情况就不同了。元组长度大小固定,元素不可变,所以存储空间固定。