核心要点
list 可变、tuple 不可变
tuple 可哈希(元素可哈希时)、更省内存
知道各自适用场景
简要回答
list 用 [],可变,适合动态序列;tuple 用 (),不可变,可作 dict 键、函数多返回值,通常略省内存。
常见误区
⚠️ 常见踩坑
把单元素 tuple 写成 '(1)'——括号不构成 tuple,逗号才是,正确写法是 '(1,)'。还有人以为 tuple「绝对不可变」,但它若含 list 等可变元素,元素内容仍可改、此时 tuple 也不可哈希。另一个高频坑是 '[[0]] * 3' 产生三个指向同一子列表的引用,改一个全变。
追问
追问 1:tuple 真的完全不可变吗?
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 个字段时优先考虑具名结构。
追问 3:list * n 有什么坑?
[[0]] * 3 创建三个引用同一 list 的槽位,修改 [0][0]=1 会全部变化。应写 [[] for _ in range(3)] 独立建列表;[0] * 3 对不可变元素是安全的。这是 Python 初学者极高频面试坑。
延伸学习
与本题相关的知识库文章、术语、工具与行业资讯。
📰 AI 资讯
🛠️ AI 工具
- index
领先的开源浏览器 Agent,可自主在网页上执行复杂任务,支持 Claude 3.7 Sonnet 和 Gemini Pro 等模型