的诀窍是:Python的乘法序列招
IPython prompt:
In [1]: A = [ [] ] * 2
In [2]: A
Out[2]: [[], []]
In [3]: A[0].append(1)
In [4]: A
Out[4]: [[1], [1]]
明显,这不是我期望的结果,我想什么是[[1], []]
。所以为什么?我发现没有关于python乘法序列的文档中的ref。
是否有任何优雅(不使用任何显式循环)的方式来做到这一点?
的诀窍是:Python的乘法序列招
IPython prompt:
In [1]: A = [ [] ] * 2
In [2]: A
Out[2]: [[], []]
In [3]: A[0].append(1)
In [4]: A
Out[4]: [[1], [1]]
明显,这不是我期望的结果,我想什么是[[1], []]
。所以为什么?我发现没有关于python乘法序列的文档中的ref。
是否有任何优雅(不使用任何显式循环)的方式来做到这一点?
A = [ [] ] * 2
创建了两个引用到相同名单列表:
>>> A = [ [] ] * 2
>>> id(A[0])
24956880
>>> id(A[1])
24956880
>>> id(A[0]) == id(A[1])
True
>>>
相反,你需要使用list comprehension:
>>> A = [[] for _ in xrange(2)]
>>> A
[[], []]
>>> A[0].append(1)
>>> A
[[1], []]
>>>
注意,如果你是Python 3的是, .x,您需要将xrange
替换为range
。
[ [] ]
是包含(引用)列表的数组。当您乘以2时,会得到一个列表,其中包含两个对列表的相同列表。试试这个:
A = [[] for i in range(5)]
它会为每个range
的勾号生成一个新的空列表。
真的不可能有一个无循环的版本,因为你真的需要构造多个列表;不可能有捷径。
没问题。我很高兴你已经更新了答案。 :) – mgilson
更正很好,但我们确实不需要看到划掉的旧版本 - 这很让人分心。 –
他收回了评论,因为你解决了这个问题。如果你愿意,我也会这样做。如果你自己的评论现在看起来不合适,你可以自己删除。 –
+1 for id()function –