Python:如何正确地将列表值附加到列表中?

时间:2014-11-11 18:31:40

标签: python list

我想将临时列表的值添加到主列表中。我尝试将一些值添加到临时列表中,然后将临时列表附加到主列表中,如下所示,但它始终显示主列表中的最新值。

>>> 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]]

7 个答案:

答案 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 referencetemp的副本添加到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[:]=[]

另请参阅:Python list slice syntax used for no obvious reason

答案 6 :(得分:0)

Python中几乎没有任何内容可以复制,除非它明确表示它会复制。特别是append没有制作副本;对您追加的对象的任何更改都将反映在您附加到的对象中,因为该列表包含对原始对象的引用。

为了避免这样的问题,当您想要一个新对象时,请不要清除现有对象。而是创建一个新对象:

temp = []

而不是

temp[:] = []

我想如果你真的想清除原来的temp列表而不是替换它,你可以在追加时复制一份:

mutR.append(temp[:])