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