2014-02-13 84 views
0

我对Python非常新,所以我很抱歉,如果这是一个相当小巧的问题。但是我正在写一个由.txt文件中的数据组成的2D列表,其中包含for循环(所有代码都可以),但循环似乎会覆盖我以前写入的所有数据,但每次都要通过,尽管我是通过循环的Python列表写入,所有以前的值被覆盖

这不是我真正的代码,而是总结了我遇到的问题。

stuff = [[None]*3]*10 

for index in range(10): 
    stuff[index][2]=index 

print(stuff) 

[[None, None, 9],[None, None, 9],[None, None, 9],[None, None, 9],[None, None, 9],[None, None, 9],[None, None, 9],[None, None, 9],[None, None, 9]] 

为什么所有的值返回为9,为什么我有什么做的就是它返回的

[[None, None, 1],[None, None, 2],[None, None, 3],[None, None, 4],[None, None, 5],[None, None, 6],[None, None, 7],[None, None, 8],[None, None, 9]] 
+0

'stuff [0]是stuff [1]'... TIL'[x] * y'特别设计 – richizy

回答

1

之所以发生这种情况是因为你的第一行:

stuff = [[None]*3]*10 

这是什么东西做的其实是创造只1阵列的[[None]*3],然后引用它10倍。

所以你的数组实际上类似于:

[[[None]*3], reference 0, reference 0, reference 0, reference 0, reference 0, reference 0, reference 0, reference 0, reference 0] 

更改您的第一行:

stuff = [[None]*3 for i in xrange(10)] 

这将在阵列中的每个位置创建一个独特的元素。

+0

感谢您的解释,我没有意识到这是列表在Python中的工作方式。 – Remnet

1

你把完全相同的数组列表中的十倍。更新其中一个阵列正在更新所有这些数组。尝试:

stuff = [[None]*3 for i in xrange(10)]