Python词典中的浅拷贝

时间:2017-10-12 10:58:19

标签: python dictionary copy

我有下面的Python代码,我试图在字典中实现浅拷贝操作:

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

print (d)
print (new_d)

现在根据我的理解,如果在我的情况下有一个像列表这样的嵌套数据结构,那么浅拷贝将不起作用。而new_d dict的变化也会影响d字典。

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

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

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

显然这是在进行深度检查。

我哪里出错了?

3 个答案:

答案 0 :(得分: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']}

答案 1 :(得分:1)

https://docs.python.org/2/library/copy.html: 浅拷贝构造一个新的复合对象,然后(尽可能)将对它的引用插入到原始对象中找到的对象。

  • 新的复合对象是new_d
  • 在原文中找到的对象是“妈妈”和“爸爸”
  • 所以引用是指“妈妈”和“爸爸”

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

答案 2 :(得分:0)

如果您希望在更改新词典时更改词典中的对象,则不应使用copydeepcopy;

只需将new_d分配给d:

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

assert d['friends'] == []