在Python中取消引用列表内的列表

时间:2013-05-13 21:37:20

标签: python list reference

当我以“通用”方式定义列表时:

>>>a=[[]]*3
>>>a
[[],[],[]]

然后尝试仅附加到外部列表的第二个元素:

>>>a[1].append([0,1])
>>>a
[[[0,1]], [[0,1]], [[0,1]]]

它附加到外部列表的所有元素,如上所示,可能是由于元素是对同一列表的引用而不是不同的列表(为什么它以这种方式工作?)。我怎样才能以相同的“通用”方式实际创建列表,这样内部列表将是不同的列表而不仅仅是引用。感谢。

1 个答案:

答案 0 :(得分:10)

你是对的,它们都是对一个列表的引用。

[[] for _ in range(3)]

是创建独立空列表列表的常用方法。你可以在Python 2.x上使用xrange,但如果长度实际上和你的例子一样小,那就不会有什么不同。

不确定如何解释原因(原因是它以这种方式实现),但你可以看到记录了这种行为(至少在传递中)here

Operation       Result                              Notes
s * n, n * s    n shallow copies of s concatenated  (2)

这里的“浅”一词恰恰意味着:元素通过引用复制。链接页面上的“注2”也回答了你的问题。