当我以“通用”方式定义列表时:
>>>a=[[]]*3
>>>a
[[],[],[]]
然后尝试仅附加到外部列表的第二个元素:
>>>a[1].append([0,1])
>>>a
[[[0,1]], [[0,1]], [[0,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”也回答了你的问题。