在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"列表,但我不明白这里有什么问题。
答案 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
的新列表,并且每次都会修改不同的列表