2013-03-27 54 views
1

基本上我想要做的是创建一个依赖列表,并将其元素之一的值设置为列表中其他元素的函数。python设置值来列出元素

>>> a = [[1]*5]*5 
>>> a 
[[1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1]] 
>>> a[2][2] = a[0][2] + a[2][1] 
>>> a 
[[1, 1, 2, 1, 1], [1, 1, 2, 1, 1], [1, 1, 2, 1, 1], [1, 1, 2, 1, 1], [1, 1, 2, 1, 1]] 
>>> a[3][2] 
2 
>>> a[4][2] 
2 
>>> a[4][4] 
1 

我只设置的值的[2] [2],但相同的值得到设置为在第三列中的每个元件。到底发生了什么,如何才能获得理想的行为?

回答

2

会发生什么事a最终包含对同一子列表的五个引用。当你改变一个子列表时,它们都会改变。

看到这一点,适用id()到每个子表:

>>> map(id, a) 
[8189352, 8189352, 8189352, 8189352, 8189352] 

正如你可以看到,它们都具有相同的ID,这意味着它们是同一个对象。

要修复,更换

a = [[1]*5]*5 

a = [[1]*5 for _ in range(5)] 

现在子列表是独立的对象:

>>> map(id, a) 
[21086256, 18525680, 18524720, 19331112, 18431472] 
+0

ty :) 这是非常翔实的。 – user5198 2013-03-27 07:01:09

1

的问题是你的清单a包含相同的列出5个引用。你需要做这样的事情:

a = [] 
for _ in range(5): 
    a += [[1] * 5]