共性 | 说明 |
---|---|
可以存放任意元素 | 一般都放同类型 |
支持索引访问 | 甚至是负数 |
支持切片操作 | |
逗号分隔元素 | |
都是有序集合(容器) | |
可以随意嵌套 | |
序列解包 | a,b = [1,2]或者 a,b=(1,2)效果是类似的 |
通用序列操作(有增加篇幅之嫌疑^_-)
运算 | 结果 |
x in s |
如果 s 中的某项等于 x 则结果为 True ,否则为 False |
x not in s |
如果 s 中的某项等于 x 则结果为 False ,否则为 True |
s + t |
s 与 t 相拼接 |
s * n 或 n * s |
相当于 s 与自身进行 n 次拼接 |
s[i] |
s 的第 i 项,起始为 0 |
s[i:j] |
s 从 i 到 j 的切片 |
s[i:j:k] |
s 从 i 到 j 步长为 k 的切片 |
len(s) |
s 的长度 |
min(s) |
s 的最小项 |
max(s) |
s 的最大项 |
s.index(x[, i[, j]]) |
x 在 s 中首次出现项的索引号(索引号在 i 或其后且在 j 之前) |
s.count(x) |
x 在 s 中出现的总次数 |
差异 | 列表 | 元组 | 说明 |
---|---|---|---|
可变性 | 可变mutable | 不可变immutable | |
可变性的另外说明 | 动态 | 静态 | 列表长度大小不固定,可以随意地增加、删减或者改变元素;元组长度大小固定,无法增加删减或者改变 |
一个元素的定义 | [1] | (1,) | 元组必须要加一个逗号,不然是元素自身的类型 |
符号 | [] | ()或者不要 | t1 = (1,2) 或者 t1 = 1,2 甚至 t1 = 1, 也是元组 |
元组打包 | 没有打包一说 | t = 1,2,3 | |
以上都是简单的,但下面这些可能你想不到
li1 = [1,2,3]
li1.__sizeof__() # 64
t1 = (1,2,3)
t1.__sizeof__() # 48
可以看到元组比列表同等条件下少了16字节
事实上,由于列表是动态的,所以它需要存储指针,来指向对应的元素
由于列表可变,所以需要额外存储已经分配的长度大小,这样 才可以实时追踪列表空间的使用情况,当空间不足时,及时分配额外空间,来看这个例子
li1 = []
li1.__sizeof__() # 空列表的存储空间为40字节
li1.append(1)
li1.__sizeof__() # 72 字节 加入了元素1之后,列表为其分配了可以存储4个元素的空间 每个元素 8字节
li1.append(2)
li1.append(3)
li1.append(4)
li1.__sizeof__() # 72字节, 所以你家了4个元素,仍然是 72
li1.append(5)
li1.__sizeof__() # 104 字节 , 再加一个元素,不够了,需要再给你32字节
上面的例子,大概描述了列表空间分配的过程。可以看到,为了减小每次增加/删减操作时 空间分配的开销,Python每次分配空间时都会额外多分配一些,这样的机制叫做over-allocating, 保证了其操作的高效性,增加/删除的时间复杂度均为O(1)
据此,可以得出:元组要比列表更加轻量级一些,元组的性能速度要略优于列表
列表可以用来实现堆栈,非常容易,最后插入的最先取出(“后进先出”)。把元素添加到堆栈的顶端,使用 append()
。从堆栈顶部取出元素,使用 pop()
,不用指定索引。
虽然列表也可以用作队列,最先加入的元素,最先取出(“先进先出”);然而,列表作为队列的效率很低。因为,在列表末尾添加和删除元素非常快,但在列表开头插入或移除元素却很慢(因为所有其他元素都必须移动一位),应该用collections.deque
>>> from collections import deque
>>> queue = deque(["Eric", "John", "Michael"])
>>> queue.append("Terry") # Terry arrives
>>> queue.append("Graham") # Graham arrives
>>> queue.popleft() # The first to arrive now leaves
'Eric'
>>> queue.popleft() # The second to arrive now leaves
'John'
>>> queue # Remaining queue in order of arrival
deque(['Michael', 'Terry', 'Graham'])