2013-06-27 94 views
2

这是我想要做的MWE内:蟒蛇 - 将号码添加到一个整数嵌套列表

lis = [] 
# Initialize empty list 
for i in range(2): 
    lis.append([[0]]*2) 

# First print 
print lis 

# Second print 
print lis[0][1][0] 

# Modify item 
lis[0][1][0] += 1 

# Third print 
print lis 

第一print返回列表作为[[[0], [0]], [[0], [0]]]这是正确的,我有第一个列表由几个列表组成,每个列表也由几个列表组成(我需要这个嵌套列表来表示我正在做什么)。 print将索引0和1中的项返回为0,这也是正确的。但第三print显示我的新名单为:代替

[[[1], [1]], [[0], [0]]] 

[[[0], [1]], [[0], [0]]] 

这是我真正瞄准。我究竟做错了什么?

+3

此外,[本vizualization](http://www.pythontutor.com/visualize.html#code=lis+%3D+%5B%图5D 0A%23%+ +初始化空+列表%0Afor + 1 + +在范围(2)%3A%0A ++++ lis.append(%5B%5B0%5D%5D * 2)%0A 0A%% 23 +第一+打印%0Aprint + LIS%0A%0A%23 +二+打印%0Aprint + LIS%5B0%5D%5B1%5D%5B0%5D%0A%0A%23 +修改+项%0Alis%5B0% 5D%5B1%5D%5B0%5D +%2B%3D + 1%0A%0A%23 + Third + print%0Aprint + lis&mode = display&cumulative = false&heapPrimitives = false&drawParentPointers = false&textReferences = false&showOnlyOutputs = false&py = 2&curInstr = 0)这工作就像它一样。 –

回答

7

发生这种情况是因为两个内部列表实际上是同一个对象的副本,所以修改一个也会影响另一个。

>>> l = [[0]]*2 
>>> [id(x) for x in l] 
[145328716, 145328716]    #same IDs 
>>> l[0].append(4) 
>>> l 
[[0, 4], [0, 4]] 

使用列表理解,以避免:

>>> l = [[0] for _ in xrange(2)] 
>>> [id(x) for x in l]   #Different IDs 
[145327372, 145327500] 
>>> l[0].append(4) 
>>> l 
[[0, 4], [0]] 
+0

嗯,那很快:)谢谢Ashwini! – Gabriel