Python 五大容器全套速查 + 常见坑汇总
2026/7/23 3:15:12 网站建设 项目流程

目录

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 五大容器全套速查 + 常见坑汇总

容器:listtuplestrsetdict

一、基础属性总表

表格

容器标识有序支持下标 / 切片可变元素要求底层结构
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()原地排序

⚠️致命大坑

  1. 正向 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,) # 正确元组

⚠️高频坑

  1. 元组不可变 ≠ 元组内部列表不能修改

python

t = (1, [2,3]) t[1].append(4) # 合法!tuple只是不允许替换内部指针,列表自身可变
  1. 没有 append、remove、pop,不能增删元素
  2. 函数return x,y,本质自动打包成 tuple 返回

3)str 字符串(不可变)

✅常用 切片s[start:end:step]s[::-1]字符串反转

⚠️坑

  1. 不可修改s[0]='a'直接报错,不能像数组一样下标修改
  2. 切片规则:左闭右开;步长为负数时,起止方向必须匹配

python

name = "gaowanxi" name[:2:-1] # 反向截取
  1. 字符串操作都会生成新字符串,原字符串不变;大量拼接优先"".join(),少用+=

4)set 集合(无序、元素唯一)

✅常用

  • add(x)添加元素,重复自动失效
  • remove(x)删除,不存在报错
  • pop()随机删除一个元素(无序,不能指定下标) 交集&、并集|、差集-

⚠️大坑

  1. 空集合不能写 {}{}是空字典;空集合只能set()
  2. 不能存放 list、dict、set;会报错 “不可哈希”
  3. 无序!不能下标访问,不支持切片
  4. 添加重复元素不会报错,自动忽略,不会抛出异常

5)dict 字典(键值对)

✅常用

  • d[key]取值;key 不存在崩溃
  • d.get(key)推荐,不存在返回 None,安全
  • pop(key)删除指定键
  • popitem()删除末尾一组键值对(3.7 + 有序)
  • update(other_dict)合并字典,同名 key 覆盖

⚠️高频坑

  1. in判断只检索 key,不会查找 value

python

d = {"name":"lisi"} print("lisi" in d) # False!只会看有没有key叫lisi
  1. key 必须可哈希,list 不能作为 key
  2. d["newkey"] = xxx:key 不存在则新增,存在则覆盖修改
  3. keys () /values () /items () 返回视图对象,跟随原字典实时变化;如需固定快照,转 list
  4. 遍历字典同时删除元素,极易出现遍历异常(同 list 删除问题)

三、五大容器通用易错知识点

1. 可变 vs 不可变区分

不可变:tuple、str

一旦创建,不能替换内部元素指针可变:list、set、dict 允许增删、修改内部元素

2. 切片通用规则(仅有序序列可用:list/tuple/str)

[起始:终止:步长]

  1. 左闭右开,取不到终止下标
  2. step>0 正向;step<0 反向
  3. 缺省:正向切片从头至尾;反向切片从尾至头

3. 哈希表容器(set、dict)特点

查找元素时间复杂度 O (1); 有序序列 list 查找是 O (n),大量查找优先选用 set/dict

4. 遍历中删除元素通用准则

有序序列 (list)、哈希容器 (dict),尽量不要在正向 for 遍历过程删除元素方案:

  1. 反向遍历删除
  2. 新建容器保存符合条件元素(列表推导式)

四、选型建议(工作开发)

  1. 需要顺序、频繁尾部增删 → list
  2. 数据固定不修改、用作函数返回多值 → tuple
  3. 文本存储、拼接处理 → str
  4. 需要去重、成员快速判断 → set
  5. 键值映射、存储对象属性 → dict

五、配套练习题(自测)

  1. t = ([1,2],3)能否修改内部列表?
  2. { [1,2] }代码报错原因?
  3. d = {"a":1}; print(1 in d)输出 True 还是 False?
  4. 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 容器面试简答题库(高频面试)

基础概念类

  1. list 和 tuple 的区别?
  • list [] 可变,支持 append/pop/insert 增删改;
  • tuple () 不可变,创建后不能替换元素;
  • tuple 占用内存略小,可用作字典 key;list 不可以;
  • 单个元素元组必须加逗号(5,)
  1. list 和 set 的区别?
  • list 有序、允许重复;set 无序、自动去重;
  • list 支持下标、切片;set 不支持;
  • set 底层哈希表,成员查找x in sO (1);list 遍历查找 O (n)。
  1. set 和 dict 底层关系? CPython 底层哈希结构几乎一致; set 只存 key;dict 存储 key+value; 空集合只能set(){}是空字典。

  2. str 为什么不能下标修改? str 是不可变对象,底层字符数组只读;任何修改操作都会生成新字符串。

内存与底层(结合你之前学 C/C++)

  1. Python list 底层是什么?和 C++ 什么容器相似? 底层是动态数组(指针数组PyObject**),等价 C++std::vector<PyObject*>; ⚠️不是 C++ std::list 双向链表!

  2. list.append () 时间复杂度?为什么有时候会触发 realloc? 平均 O (1);当底层 capacity 容量用尽时,触发扩容,重新申请更大堆内存、拷贝所有指针。

  3. list.__sizeof__()包含什么? 固定头部 40 字节 + capacity × 8 字节(64 位);len()是有效元素数量,不等于底层容量 capacity。

代码坑类(面试官最爱考)

  1. 正向 for 遍历 list 同时 remove 元素会出现什么问题? 元素被删除后后续数据前移,迭代器跳过下一个元素,产生漏删。 解决:反向遍历 /while 循环 / 列表推导式筛选新列表。

  2. 元组不可变,为什么元组内的列表可以追加元素? tuple 约束:不能修改存储对象的地址; 不约束地址指向对象自身是否可变。

  3. 字典d["key"]d.get("key")区别

  • d["key"]:key 不存在直接抛出异常;
  • d.get("key"):不存在返回 None,还可以设置默认值get(k, 默认值),生产推荐。

遍历相关

  1. 遍历字典时能否删除键值对? 正向遍历不建议直接 pop,可能引发遍历异常; 稳妥方案:把 keys 转成 list 再遍历删除。

拷贝问题

  1. a = [1,2,3]; b = a是什么拷贝? 仅仅是引用赋值,a、b 指向同一个列表;修改其中一个互相影响。 浅拷贝:b = list(a)/a.copy()深层嵌套对象需要深拷贝:import copy; b = copy.deepcopy(a)

切片考点

  1. 切片s[::-1]作用? 生成反转后的新序列(list/tuple/str 通用)。 反向切片注意:步长为负数时,起止下标扫描方向颠倒。

哈希考点

  1. 哪些类型可以作为 dict 的 key /set 元素? ✅可哈希:int、float、str、bool、tuple (不含可变元素) ❌不可哈希:list、set、dict

三、拓展思考题(进阶,笔试经常出现)

  1. 如何快速对列表去重,并且保留原有顺序?

python

lst = [2,2,1,3,1] res = list(dict.fromkeys(lst))
  1. 不使用临时变量,交换字典两个 key 对应的值

python

d = {"a":10,"b":20} d["a"], d["b"] = d["b"], d["a"]
  1. 列表推导式、for 循环选择场景? 简单筛选优先列表推导式,速度更快;复杂逻辑多行代码使用普通 for 循环。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询