我想将临时列表的值添加到主列表中。我尝试将一些值添加到临时列表中,然后将临时列表附加到主列表中,如下所示,但它始终显示主列表中的最新值。
>>> temp =[]
>>> temp.append(123)
>>> temp.append(10)
>>> temp.append(18)
>>> mutR =[]
>>> mutR.append(temp)
>>> print mutR
[[123, 10, 18]]
>>> temp[:]=[]
>>> temp.append(3)
>>> temp.append(4)
>>> temp.append(5)
>>> mutR.append(temp)
>>> print mutR
[[3, 4, 5], [3, 4, 5]]
我的期望是:
>>> print mutR
[[123, 10, 18], [3, 4, 5]]
但它是[[3, 4, 5], [3, 4, 5]]
。
答案 0 :(得分:2)
声明
temp[:] = []
从temp
中移除所有元素,而您想要做的是
temp = []
将创建一个新的空列表并将其引用存储到temp
。
在您的代码中,只有一个列表对象,如果添加例如
,则会向mutR
添加两次
temp.append(99)
print mutR
到原始代码,您会看到[[3, 4, 5, 99], [3, 4, 5, 99]]
作为答案。
答案 1 :(得分:1)
当您将temp
追加到mutR
时,mutR
仅包含参考至temp
。无论对temp
应用何种更改,mutR 中的 temp也会相应更改。因此,解决方案是使用复制。
>>> temp =[]
>>> temp.append(123)
>>> temp.append(10)
>>> temp.append(18)
>>> mutR =[]
>>> import copy
>>> mutR.append(copy.copy(temp))
>>> print mutR
[[123, 10, 18]]
>>> temp[:]=[]
>>> temp.append(3)
>>> temp.append(4)
>>> temp.append(5)
>>> mutR.append(temp)
>>> print mutR
[[123, 10, 18], [3, 4, 5]]
答案 2 :(得分:1)
您在这里
>>> temp =[]
>>> temp.append(123)
>>> temp.append(10)
>>> temp.append(18)
>>> mutR =[temp]
>>> print(mutR)
[[123, 10, 18]]
>>>
>>>
>>> temp=[]
>>> temp.append(3)
>>> temp.append(4)
>>> temp.append(5)
>>> mutR.append(temp)
>>> print(mutR)
[[123, 10, 18], [3, 4, 5]]
答案 3 :(得分:0)
您正在寻找extend
方法。
>>> l = [1, 2, 3]
>>> l.extend([4, 5, 6])
>>> print l
[1, 2, 3, 4, 5, 6]
答案 4 :(得分:0)
mutR.append(temp)
向mutR
添加了临时值,temp[:]=[]
再次将temp
设为空列表,temp
中的mutR
也变为空列表因为它是参考到temp
而非 副本。
然后您将三个元素附加到空的临时文件,并将temp
添加到mutR
mutR.append(temp)
,这样您就有两个引用到temp
了你的清单。
最初使用mutR.append(temp[:]) # <- copy of temp not a reference
将temp
的副本添加到mutR
,以便以后对temp的更改不会影响它。
In [6]: mutR.append(temp[:]) # copy temp
In [7]: temp[:]=[]
In [8]: temp.append(3)
In [9]: temp.append(4)
In [10]: temp.append(5)
In [11]: mutR.append(temp)
In [12]: mutR
Out[12]: [[123, 10, 18], [3, 4, 5]]
答案 5 :(得分:0)
您需要指定temp[]=[]
而不是temp[:]=[]
答案 6 :(得分:0)
Python中几乎没有任何内容可以复制,除非它明确表示它会复制。特别是append
没有制作副本;对您追加的对象的任何更改都将反映在您附加到的对象中,因为该列表包含对原始对象的引用。
为了避免这样的问题,当您想要一个新对象时,请不要清除现有对象。而是创建一个新对象:
temp = []
而不是
temp[:] = []
我想如果你真的想清除原来的temp
列表而不是替换它,你可以在追加时复制一份:
mutR.append(temp[:])