【发布时间】:2017-06-07 20:32:32
【问题描述】:
我一直在 Python 中使用 [Value] * Count 符号来初始化列表。例如,[False] * 3 导致创建列表 [False, False False]。我尝试使用相同的符号来初始化列表列表。
>>>a = [[0] * 2] * 3
>>>print a
[[0, 0], [0, 0], [0, 0]]
>>>a[0][1] = 23
>>>print a
[[0, 23], [0, 23], [0, 23]]
>>>id(a[0])
139978350226680
>>>id(a[1])
139978350226680
>>>id(a[2])
139978350226680
我们可以看到,a 的元素三次引用单个列表,而不是引用三个不同的列表。 1. 为什么会这样? 2. 初始化列表列表的正确方法是什么?
之前的答案中已经指出了相同的行为:https://stackoverflow.com/a/13382804/4716199
【问题讨论】:
-
“正确”的方法是使用 for 循环或列表推导。
-
如果您使用
b = [0] * 2; a = [b] * 3,您会惊讶于a包含3 个对b的引用吗? -
@PM2Ring 这是有道理的。我没有意识到 * 不会创建新副本,它只是复制参考。谢谢:)
-
这篇文章可能对您也有帮助:Facts and myths about Python names and values,由 SO 资深人士 Ned Batchelder 撰写。
-
@PM2Ring 这篇文章很有用。感谢分享:)
标签: python python-2.7 list