那个让我浪费时间的 Python List Bug 😅
发布: (2025年12月24日 GMT+8 10:29)
2 min read
原文: Dev.to
Source: Dev.to
问题
我最近在解决一个需要二维列表的题目时,遇到了一个奇怪的 Python bug。
代码看起来是对的,但输出却完全错误。罪魁祸首正是这一行:
index = [[0, 0]] * n
如果你已经写了有一段时间的 Python,可能会期望它会创建 n 行,每行都是 [0, 0],像这样:
[
[0, 0],
[0, 0],
[0, 0]
]
为什么 * 在这里不起作用
Python 并不会创建 n 个独立的内部列表。它只会创建 一个 列表 [0, 0],并把它的引用复制 n 次。所有行都指向同一个对象。
证明
index = [[0, 0]] * 3
index[0][0] = 7
print(index)
输出
[[7, 0], [7, 0], [7, 0]]
修改一个值会导致每一行都被修改,因为 * 运算符执行的是浅拷贝,实际上等价于:
index = [same_list, same_list, same_list]
正确的做法
使用列表推导式为每一行创建一个新的内部列表:
index = [[0, 0] for _ in range(n)]
快速检查
index = [[0, 0] for _ in range(3)]
index[0][0] = 7
print(index)
输出
[[7, 0], [0, 0], [0, 0]]
现在只有预期的那一行被修改。
何时 * 实际上是可以的
在使用不可变值时,使用 * 完全没有问题:
arr = [0] * 5 # 完全可以接受
问题只会在你对嵌套的可变对象(如列表)使用 * 时出现。