目录
Python 五大容器全套速查 + 常见坑汇总
一、基础属性总表
二、逐个容器核心 API + 高频坑
1)list 列表
2)tuple 元组(不可变序列)
3)str 字符串(不可变)
4)set 集合(无序、元素唯一)
5)dict 字典(键值对)
三、五大容器通用易错知识点
1. 可变 vs 不可变区分
2. 切片通用规则(仅有序序列可用:list/tuple/str)
3. 哈希表容器(set、dict)特点
4. 遍历中删除元素通用准则
四、选型建议(工作开发)
五、配套练习题(自测)
把上面(五、配套练习题(自测))练习题答案 + 解析,给一份容器面试简答题库。
一、练习题答案 + 详细解析
题目 1
题目 2
题目 3
题目 4
二、Python 容器面试简答题库(高频面试)
基础概念类
内存与底层(结合你之前学 C/C++)
代码坑类(面试官最爱考)
遍历相关
拷贝问题
切片考点
哈希考点
三、拓展思考题(进阶,笔试经常出现)
Python 五大容器全套速查 + 常见坑汇总
容器:list、tuple、str、set、dict
一、基础属性总表
表格
| 容器 | 标识 | 有序 | 支持下标 / 切片 | 可变 | 元素要求 | 底层结构 |
|---|---|---|---|---|---|---|
| list | [] | ✅ | ✅ | ✅ | 任意对象 | 动态数组(类似 C++ vector) |
| tuple | () | ✅ | ✅ | ❌ | 任意对象 | 固定数组,只读 |
| str | "" | ✅ | ✅ | ❌ | 只能字符 | 字符数组 |
| set | {} | ❌ | ❌ | ✅ | 必须可哈希 | 哈希表 |
| dict | {k:v} | ✅(3.7+) | ❌ | ✅ | key 可哈希,value 无限制 | 哈希表 |
可哈希类型:int、float、str、tuple(内部不含可变元素) 不可哈希:list、set、dict,不能做 set 元素、dict 的 key
二、逐个容器核心 API + 高频坑
1)list 列表
✅常用
append(x)尾部追加,平均 O (1)insert(idx,x)指定下标插入 O (n)pop()/pop(idx)删除remove(val)根据值删除第一个匹配元素reverse()原地反转sort()原地排序
⚠️致命大坑
- 正向 for 遍历同时删除元素 → 漏删
python
# 错误 lst = [11,2,13,4] for i in lst: if i>10: lst.remove(i)✅解决方案:反向遍历 /while 循环 / 列表推导式 2.list.__sizeof__()包含底层 capacity 预留容量,len () 才是有效元素个数3. 列表赋值是引用拷贝,a = lst,修改 a 会影响原列表;深拷贝要用copy.deepcopy()4.remove(x)只删除第一个匹配项,重复元素不会全部删除
2)tuple 元组(不可变序列)
✅特性 创建:t=(1,2,3);单个元素必须加逗号t=(88,)
python
t = (10) # int整数!不是元组 t = (10,) # 正确元组⚠️高频坑
- 元组不可变 ≠ 元组内部列表不能修改
python
t = (1, [2,3]) t[1].append(4) # 合法!tuple只是不允许替换内部指针,列表自身可变- 没有 append、remove、pop,不能增删元素
- 函数
return x,y,本质自动打包成 tuple 返回
3)str 字符串(不可变)
✅常用 切片s[start:end:step]s[::-1]字符串反转
⚠️坑
- 不可修改:
s[0]='a'直接报错,不能像数组一样下标修改 - 切片规则:左闭右开;步长为负数时,起止方向必须匹配
python
name = "gaowanxi" name[:2:-1] # 反向截取- 字符串操作都会生成新字符串,原字符串不变;大量拼接优先
"".join(),少用+=
4)set 集合(无序、元素唯一)
✅常用
add(x)添加元素,重复自动失效remove(x)删除,不存在报错pop()随机删除一个元素(无序,不能指定下标) 交集&、并集|、差集-
⚠️大坑
- 空集合不能写 {},
{}是空字典;空集合只能set() - 不能存放 list、dict、set;会报错 “不可哈希”
- 无序!不能下标访问,不支持切片
- 添加重复元素不会报错,自动忽略,不会抛出异常
5)dict 字典(键值对)
✅常用
d[key]取值;key 不存在崩溃d.get(key)推荐,不存在返回 None,安全pop(key)删除指定键popitem()删除末尾一组键值对(3.7 + 有序)update(other_dict)合并字典,同名 key 覆盖
⚠️高频坑
in判断只检索 key,不会查找 value
python
d = {"name":"lisi"} print("lisi" in d) # False!只会看有没有key叫lisi- key 必须可哈希,list 不能作为 key
d["newkey"] = xxx:key 不存在则新增,存在则覆盖修改- keys () /values () /items () 返回视图对象,跟随原字典实时变化;如需固定快照,转 list
- 遍历字典同时删除元素,极易出现遍历异常(同 list 删除问题)
三、五大容器通用易错知识点
1. 可变 vs 不可变区分
不可变:tuple、str
一旦创建,不能替换内部元素指针可变:list、set、dict 允许增删、修改内部元素
2. 切片通用规则(仅有序序列可用:list/tuple/str)
[起始:终止:步长]
- 左闭右开,取不到终止下标
- step>0 正向;step<0 反向
- 缺省:正向切片从头至尾;反向切片从尾至头
3. 哈希表容器(set、dict)特点
查找元素时间复杂度 O (1); 有序序列 list 查找是 O (n),大量查找优先选用 set/dict
4. 遍历中删除元素通用准则
有序序列 (list)、哈希容器 (dict),尽量不要在正向 for 遍历过程删除元素方案:
- 反向遍历删除
- 新建容器保存符合条件元素(列表推导式)
四、选型建议(工作开发)
- 需要顺序、频繁尾部增删 → list
- 数据固定不修改、用作函数返回多值 → tuple
- 文本存储、拼接处理 → str
- 需要去重、成员快速判断 → set
- 键值映射、存储对象属性 → dict
五、配套练习题(自测)
t = ([1,2],3)能否修改内部列表?{ [1,2] }代码报错原因?d = {"a":1}; print(1 in d)输出 True 还是 False?s = "hello"; s[0]='H'是否合法?
把上面(五、配套练习题(自测))练习题答案 + 解析,给一份容器面试简答题库。
一、练习题答案 + 详细解析
题目 1
python
t = ([1,2],3) # 能否修改内部列表? t[0].append(99) print(t)✅合法,可以修改解析: tuple 不可变的含义:不允许修改元组内部保存的指针t[0]保存列表对象的地址,地址不能替换; 但列表本身是可变对象,可以对列表内部增删元素。 输出结果:([1, 2, 99], 3)
易错区分:
t[0] = [5,6]这一行会报错,属于替换指针,不允许!
题目 2
python
{ [1,2] }❌ 直接报错 报错信息:TypeError: unhashable type: 'list'解析:set的元素、dict的 key要求必须可哈希 (hashable)list 是可变容器,无法计算固定哈希值,禁止放入集合 / 充当字典键。
允许放入的:{(1,2)}元组(内部无可变元素,可哈希)
题目 3
python
d = {"a":1} print(1 in d)输出:False核心坑:in作用在字典上,只会遍历、判断 key,不会检索 value等价判断:1 in d.keys()
想要判断值存在:1 in d.values()
题目 4
python
s = "hello" s[0]='H'❌ 报错 解析: 字符串str属于不可变序列,不支持下标原地修改; 想要修改只能切片拼接生成新字符串:s = "H" + s[1:]
二、Python 容器面试简答题库(高频面试)
基础概念类
- list 和 tuple 的区别?
- list [] 可变,支持 append/pop/insert 增删改;
- tuple () 不可变,创建后不能替换元素;
- tuple 占用内存略小,可用作字典 key;list 不可以;
- 单个元素元组必须加逗号
(5,)。
- list 和 set 的区别?
- list 有序、允许重复;set 无序、自动去重;
- list 支持下标、切片;set 不支持;
- set 底层哈希表,成员查找
x in sO (1);list 遍历查找 O (n)。
set 和 dict 底层关系? CPython 底层哈希结构几乎一致; set 只存 key;dict 存储 key+value; 空集合只能
set(),{}是空字典。str 为什么不能下标修改? str 是不可变对象,底层字符数组只读;任何修改操作都会生成新字符串。
内存与底层(结合你之前学 C/C++)
Python list 底层是什么?和 C++ 什么容器相似? 底层是动态数组(指针数组
PyObject**),等价 C++std::vector<PyObject*>; ⚠️不是 C++ std::list 双向链表!list.append () 时间复杂度?为什么有时候会触发 realloc? 平均 O (1);当底层 capacity 容量用尽时,触发扩容,重新申请更大堆内存、拷贝所有指针。
list.__sizeof__()包含什么? 固定头部 40 字节 + capacity × 8 字节(64 位);len()是有效元素数量,不等于底层容量 capacity。
代码坑类(面试官最爱考)
正向 for 遍历 list 同时 remove 元素会出现什么问题? 元素被删除后后续数据前移,迭代器跳过下一个元素,产生漏删。 解决:反向遍历 /while 循环 / 列表推导式筛选新列表。
元组不可变,为什么元组内的列表可以追加元素? tuple 约束:不能修改存储对象的地址; 不约束地址指向对象自身是否可变。
字典
d["key"]和d.get("key")区别
d["key"]:key 不存在直接抛出异常;d.get("key"):不存在返回 None,还可以设置默认值get(k, 默认值),生产推荐。
遍历相关
- 遍历字典时能否删除键值对? 正向遍历不建议直接 pop,可能引发遍历异常; 稳妥方案:把 keys 转成 list 再遍历删除。
拷贝问题
a = [1,2,3]; b = a是什么拷贝? 仅仅是引用赋值,a、b 指向同一个列表;修改其中一个互相影响。 浅拷贝:b = list(a)/a.copy()深层嵌套对象需要深拷贝:import copy; b = copy.deepcopy(a)
切片考点
- 切片
s[::-1]作用? 生成反转后的新序列(list/tuple/str 通用)。 反向切片注意:步长为负数时,起止下标扫描方向颠倒。
哈希考点
- 哪些类型可以作为 dict 的 key /set 元素? ✅可哈希:int、float、str、bool、tuple (不含可变元素) ❌不可哈希:list、set、dict
三、拓展思考题(进阶,笔试经常出现)
- 如何快速对列表去重,并且保留原有顺序?
python
lst = [2,2,1,3,1] res = list(dict.fromkeys(lst))- 不使用临时变量,交换字典两个 key 对应的值
python
d = {"a":10,"b":20} d["a"], d["b"] = d["b"], d["a"]- 列表推导式、for 循环选择场景? 简单筛选优先列表推导式,速度更快;复杂逻辑多行代码使用普通 for 循环。