核心要点

  • list 可变、tuple 不可变

  • tuple 可哈希(元素可哈希时)、更省内存

  • 知道各自适用场景

简要回答

list 用 [],可变,适合动态序列;tuple 用 (),不可变,可作 dict 键、函数多返回值,通常略省内存。

标准回答

list tuple
语法 [1, 2] (1, 2)1, 2
可变
可哈希 ✅(元素均可哈希时)
方法 append, extend, sort... 仅 count, index
内存 略多 略少

选型

  • 长度/内容会变 → list
  • 固定记录(坐标、RGB)、dict 键、函数返回多值 → tuple
  • namedtuple / dataclass 可读性更好

注意:单元素 tuple 须 (1,)(1) 只是带括号的 int。

性能:tuple 创建与迭代略快;大量同质数据可考虑 array.array 或 NumPy。

常见误区

⚠️ 常见踩坑

把单元素 tuple 写成 '(1)'——括号不构成 tuple,逗号才是,正确写法是 '(1,)'。还有人以为 tuple「绝对不可变」,但它若含 list 等可变元素,元素内容仍可改、此时 tuple 也不可哈希。另一个高频坑是 '[[0]] * 3' 产生三个指向同一子列表的引用,改一个全变。

追问

追问 1tuple 真的完全不可变吗?

tuple 本身不能增删改元素,但若元素是可变对象(如 list),其内容仍可变:t = ([1],); t[0].append(2) 合法,此时 tuple 不可哈希。需要真正不可变嵌套结构时用 tuple 包不可变元素或 frozenset

追问 2何时用 namedtuple 或 dataclass 替代 tuple?

字段有语义名时 Point(x=1, y=2)(1, 2) 可读、可维护。dataclass 支持默认值、方法和更灵活的校验;namedtuple 更轻量且不可变,适合只读记录行。API 返回值超过 3 个字段时优先考虑具名结构。

追问 3list * n 有什么坑?

[[0]] * 3 创建三个引用同一 list 的槽位,修改 [0][0]=1 会全部变化。应写 [[] for _ in range(3)] 独立建列表;[0] * 3 对不可变元素是安全的。这是 Python 初学者极高频面试坑。

延伸学习

与本题相关的知识库文章、术语、工具与行业资讯。