Python字典复制方法

时间:2016-03-10 05:08:33

标签: python dictionary

我对字典复制方法有疑问 例如,我说我有

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

>> copy_dict = d.copy()

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

>> id(d)
o/p = 140634603873176

>> id(copy_dict)
o/p = 140634603821328

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

>> id(d['pears'])
o/p = 140634603971648
>> id (copy_dict['pears'])
o/p = 140634603971648

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

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

>> d['pears'] = 700
>> print copy_dict['pears']
o/p = 200

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

请您详细说明深层和浅层副本之间的区别吗?

2 个答案:

答案 0 :(得分:2)

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

  

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

     

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

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

答案 1 :(得分:0)

原因是您执行了一个替换值的赋值操作,而不是值修改操作。

copy_dict = d.copy()

导致创建新dict并从d初始化其键/值。您注意到了重要的一点 - 这些是具有不同ID的独立对象,恰好会引用相同的键和值。

d['pears'] = 700

200删除了对d['pears']的引用,并添加了对700的引用。这个重新分配是在d对象本身上进行的,因此其他完全由相同的键和值初始化的dicts自然不会看到它。

相反,假设您只是将原始字典分配给第二个变量

copy_dict = d

此处,由于dcopy_dict都引用相同的dict,因此两个变量都会看到dict上的重新分配,因为它们引用同一个对象。