Python字典复制方法

san*_*909 5 python dictionary

我有字典复制方法的问题例如让我说我有

>> d = {'pears': 200, 'apples': 400, 'oranges': 500, 'bananas': 300}

>> copy_dict = d.copy()
Run Code Online (Sandbox Code Playgroud)

现在,如果我检查d和copy_dict的id,则两者都不同

>> id(d)
o/p = 140634603873176

>> id(copy_dict)
o/p = 140634603821328
Run Code Online (Sandbox Code Playgroud)

但如果我检查字典中对象的id,它们是相同的意思是id(d ['pears'])= id(copy_dict ['pears'])

>> id(d['pears'])
o/p = 140634603971648
>> id (copy_dict['pears'])
o/p = 140634603971648
Run Code Online (Sandbox Code Playgroud)

新dict中的所有对象都引用与原始dict相同的对象.

现在,如果我在d中更改键'pears'的值,copy_dict中的相同键没有变化,当我现在检查id时,id(d ['pears'])!= id(copy_dict ['pears'] )

>> d['pears'] = 700
>> print copy_dict['pears']
o/p = 200
Run Code Online (Sandbox Code Playgroud)

我的问题是,如果新dict中的对象是与原始字典相同的对象的引用,为什么当原始字典中的值发生更改时,新字典的值不会改变,以及Python如何立即更改id因为它看到价值变了?

你能否详细说明深浅拷贝的区别?

lci*_*amp 2

通过更改值,您正在更改键所指向的内容。更改原始字典中的值不会改变副本中的键所指向的内容。

浅拷贝构造一个新的复合对象,然后(尽可能)将引用插入到原始对象中找到的对象。

深层复制构造一个新的复合对象,然后递归地将在原始对象中找到的对象的副本插入其中。

当您复制某些内容时,它会复制正在复制的对象的原始值,但会创建一个新对象。它不镜像原始对象。