我有下面的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': []}
显然这是在进行深度检查。
我哪里出错了?
答案 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: 浅拷贝构造一个新的复合对象,然后(尽可能)将对它的引用插入到原始对象中找到的对象。
您没有更改引用对象的内容,您更改了对象(列表)本身。
答案 2 :(得分:0)
如果您希望在更改新词典时更改词典中的对象,则不应使用copy
或deepcopy
;
只需将new_d分配给d:
d = {'name':'Subhayan','age':32,'friends':['papa','mama']}
new_d = d
new_d['friends'] = []
assert d['friends'] == []