009. 元组和列表有什么区别
- 这个题是简单的,但要拿满分或者说高分不容易
相同点
共性 | 说明 |
---|---|
可以存放任意元素 | 一般都放同类型 |
支持索引访问 | 甚至是负数 |
支持切片操作 | |
逗号分隔元素 | |
都是有序集合(容器) | |
可以随意嵌套 | |
序列解包 | 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 = [ i for i in range(10)] 是列表推导式
- 但没有元组推导式,t1 = ( i for i in range(10)) 是一个生成器
- 字典和集合有单独的推导式
其他
以上都是简单的,但下面这些可能你想不到
- 列表和元组存储同样的元素,所用的空间并不一样
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'])