2017-10-12 115 views
-1

我有以下Python代码在我试图在字典实现浅拷贝操作:浅拷贝

d = {'name':'Subhayan','age':32,'friends':['papa','mama']} 
new_d = d.copy() 
new_d['friends'] = [] 

print (d) 
print (new_d) 

现在按照我的理解,如果有一个嵌套的数据结构像列表在我的情况下浅副本将无法正常工作。 new_d字典中的变化也会影响字典。

有人可以告诉我,如果我的理解是正确的吗?

运行此脚本后得到的答案是不同的。

{'name': 'Subhayan', 'age': 32, 'friends': ['papa', 'mama']} 
{'name': 'Subhayan', 'age': 32, 'friends': []} 

显然这是在做一个深层次的拷贝。

我去哪里错了?

+0

是的,引用不是作为d.copy()的一部分“深度复制”的。 如果您也想复制它们,则需要使用copy.deepcopy(d)。 否则,如果你想有一个“空”的引用,你将不得不实现自己的副本功能.... – Aviad

+0

记住执行一个赋值,它将一个新对象绑定到一个名称和执行与名称绑定的现有对象上的突变。看看你做这个变种时会发生什么'new_d ['friends'] [:] = []'。 –

回答

1

写入的代码不会遇到锯齿问题。但是,如果您修改列表中的其中一个值,则该更改将显示在两个字典中。

d = {'name':'Subhayan','age':32,'friends':['papa','mama']} 
new_d = d.copy() 
new_d['friends'][0] = 'new value' 

print (d) 
print (new_d) 

# returns: 
{'age': 32, 'name': 'Subhayan', 'friends': ['new value', 'mama']} 
{'age': 32, 'name': 'Subhayan', 'friends': ['new value', 'mama']} 
0

如果你想在字典中的对象进行更改时,新的词典改变,你不应该使用copydeepcopy可言;

只是分配new_d到d:

d = {'name':'Subhayan','age':32,'friends':['papa','mama']} 
new_d = d 
new_d['friends'] = [] 

assert d['friends'] == [] 
1

https://docs.python.org/2/library/copy.html: 浅表副本构造新化合物对象,然后(在可能的范围)插入到其在原始找到的对象的引用。

  • 新化合物目的是new_d
  • 在原有发现的对象是“妈妈”和“爸爸”
  • 这样的参考文献是对“妈妈”和“爸爸”

您没有更改引用对象的内容,而是更改了对象(列表)本身。