Python的Deep副本不会在新的对象实例中复制字典

时间:2014-04-22 22:33:24

标签: python copy deep-copy

我想复制一个对象(包含一个字典)。我打算在递归树中传递这个对象,我希望树中的每个节点都接收一个新副本,而不是链接副本。

我发现对象“new_t1”和“new_t2”中的词典是相同的,即使对象ID不同。

是否有一种简单的方法来创建对象的真正深层副本,或者我是否必须编写自己的方法来解决它只是指向同一个字典的指针?

hcPartial是一个包含字典和其他一些内容的类:

class hc:

    dictionary = {'00':[], '01':[], '10':[], '11':[]}

说明失败的代码:

#Check making two hypercube copies and independently adding to one of them
nhc1 = copy.deepcopy(hcPartial)
nhc2 = copy.deepcopy(hcPartial)

print "ID 1: ", id(nhc1), "ID 2: ", id(nhc2)
print "D ID 1: ", id(nhc1.dictionary), "D ID 2: ", id(nhc2.dictionary)
print nhc1.dictionary
nhc1.forwardConnect('00','01')
print nhc1.dictionary
print nhc2.dictionary
print nhc1
print nhc2

输出:

ID 1:  92748416 ID 2:  92748696
D ID 1:  92659408 D ID 2:  92659408
{'11': [], '10': [], '00': [], '01': []}
{'11': [], '10': [], '00': ['01'], '01': []}
{'11': [], '10': [], '00': ['01'], '01': []}
<hypercube.HyperCube2D instance at 0x05873A80>
<hypercube.HyperCube2D instance at 0x05873B98>

预期输出:

{'11': [], '10': [], '00': [], '01': []}
{'11': [], '10': [], '00': ['01'], '01': []}
{'11': [], '10': [], '00': [], '01': []}

已更正在课程中添加__init__()的输出。作品!

ID 1:  92746056 ID 2:  92730952
Dict ID 1:  92665728 Dict ID 2:  92680240
{'11': [], '10': [], '00': [], '01': []}
forwardConnect ID 1:  91704656 forwardConnect ID 2:  91704656
{'11': [], '10': [], '00': ['01'], '01': []}
{'11': [], '10': [], '00': [], '01': []}
<hypercube.HyperCube2D instance at 0x05873148>
<hypercube.HyperCube2D instance at 0x0586F648>

1 个答案:

答案 0 :(得分:1)

如上所述:

  

问题是我班上没有

__init__() 
  

在其中。

     

如果您希望每个实例都有自己的字典,则应将其初始化从类级别移动到方法中:

 __init__(): 
 self.dictionary = ... 

<强>参考