更改列表中列表值的奇怪行为

时间:2015-05-19 23:16:41

标签: python list

在python项目上编码时,当我尝试更改另一个列表中列表的值时,我注意到了一种奇怪的行为。

无效代码:

lst = []
to_add = [None,None,None]

for i in range(3):
    lst.append(to_add)

for i in range(3):
    lst[i][0] = anotherslistoflists[i][0]

令我惊讶的是这个例子给出了意想不到的结果。具体来说,每个lst [i] [0]都被赋予了相同的值,这个值是"另一个列表列表中的第一个元素"列表。

结果示例(打印时)

("word1",None,None)
("word1",None,None)
("word1",None,None)

工作代码:

lst = []

for i in range(5):
    lst.append([None,None,None])

# same code as above

结果示例2 (预期结果)

("word1",None,None)
("word2",None,None)
("word3",None,None)

当然,你可以看到问题已经解决,但我想知道为什么第一个代码不起作用。 " to_add"" to_add"列表,但我不明白这里有什么问题。

3 个答案:

答案 0 :(得分:1)

您要追加相同的列表to_add三次。然后,一旦你修改它,指向它的所有三个项目将反映相同的变化。如果要创建具有相同值的新副本,可以使用内置的list函数:

for i in range(3):
    lst.append(list(to_add))

答案 1 :(得分:0)

您要将相同的列表to_add添加到lst

>>> a = [None]
>>> b = [a]
>>> c = [a]
>>> print a, b, c
[None] [[None]] [[None]]
>>> a[0] = 1
>>> print a, b, c
[1] [[1]] [[1]]

答案 2 :(得分:0)

在第一种情况下,您没有添加add_to_list的副本,而是实际上一遍又一遍地添加该确切列表,所以当您稍后更改它时,您正在更改真实的add_to_list以及任何地方是指它。在第二种情况下,您每次都会添加一个包含None的新列表,并且每次都会修改不同的列表