2015-09-25 105 views
0

我有一个只包含一个字典项目的列表。我想修改这个项目并将其附加到另一个列表中。当我追加到另一个列表中时,它仍然保留指针,因为它通过设计进行了引用复制。在Python中按值附加列表元素的变通办法

根据this link即使列表使用[:]表示法复制,它仍保留与其内部对象的链接。

我的问题是我如何解决这个限制,或者有什么解决办法,我想实现?以下是代码片段:

a=[] 
b=[] 
a=[{'sk' : 1, 'id' : 'P001', 'status' : 'NEW'}] 
a[0]['sk']=a[0]['sk']+1 
a[0]['status']='CURRENT' 
b.append(a[0]) 
a[0]['sk']=a[0]['sk']+1 
a[0]['status']='EXISTING' 
b.append(a[0]) 
b 
[{'id': 'P001', 'sk': 3, 'status': 'EXISTING'}, 
{'id': 'P001', 'sk': 3, 'status': 'EXISTING'}] 

正如你所看到的,改变[A]改变所有元素[B]。我也尝试改变b [0],b 1等。它仍然是一样的。

是否有任何解决办法,我正在尝试做什么?

+1

'L [:]'只是一个*浅*复印件;与可变容器的可变容器,你需要一个*深*副本。 – jonrsharpe

回答

1

你只需要调用.copy()a当你把它追加到b

b = [] 
a = [{'sk' : 1, 'id' : 'P001', 'status' : 'NEW'}] 
a[0]['sk'] += 1 
a[0]['status'] = 'CURRENT' 
b.append(a[0].copy()) 
a[0]['sk'] = a[0]['sk']+1 
a[0]['status'] = 'EXISTING' 
b.append(a[0]) 
print(b) 

[{'sk': 2, 'id': 'P001', 'status': 'CURRENT'}, {'sk': 3, 'id': 'P001', 'status': 'EXISTING'}] 
+0

谢谢摩根。 –

+0

@ArvindKandaswamy没问题,很高兴我能帮上忙。 –

2

您可以使用.copy()复制内部dict

>>> a = [] 
>>> b = [] 
>>> a=[{'sk' : 1, 'id' : 'P001', 'status' : 'NEW'}] 
>>> a[0]['sk'] += 1 
>>> a[0]['status']='CURRENT' 
>>> b.append(a[0].copy()) 
>>> a[0]['sk'] += 1 
>>> a[0]['status']='EXISTING' 
>>> b.append(a[0].copy()) 
>>> b 
[{'sk': 2, 'status': 'CURRENT', 'id': 'P001'}, 
{'sk': 3, 'status': 'EXISTING', 'id': 'P001'}]