用deepcopy创建一个新的obj,但是新的obj子类仍然与旧的obj共享变量



我正在创建一个对象列表,当我创建新实例时,第三级类的所有属性的内容都等于最后一次赋值。即使我使用deepcopy,外部类是一个副本,但内部类不是。

例如:

PCC->  {'id': 'PCC1'}
    PA->  {'id': 'PA1', 'o': 'O1'}
        PC->  {'id': 'PC1'}
            PT
            ->P  p2
            ->V  v2
            ->R  r2
        PC->  {'id': 'PC2'}
            PT
            ->P  p2
            ->V  v2
            ->R  r2
下面是我的代码示例:
import copy
class V:
    id = ''
class P:
    id = ''    
class R:
    id = ''
class PT:    
    v = V()
    p = P()
    r = R()
    def __copy__(self):
        print ("COPY!!!") #define explicit copy behaviour
        s = self.__class__()
        s.p = self.p.id = '' # make a copy of the list rather than a pointer to same
        s.v = self.v.id = '' # make a copy of the list rather than a pointer to same
        s.r = self.r.id = '' # make a copy of the list rather than a pointer to same
        return s
class C:
    id = ''
class PC(C):
    pr = PT()
class O:
    name = ''
class A:
    id = ''
    o = O()
class PA(A):
    pc = []#PC
class CC:
    id = ''
class PCC(CC):
    pa = PA()
if __name__ == '__main__':
    pcc = PCC()
    pcc.id = 'PCC1'
    pcc.pa.id = 'PA1'
    pcc.pa.o = 'O1'
    pc = PC()
    pc.id = 'PC1'
    pc.pr.p.id = 'p1'
    pc.pr.v.id = 'v1'
    pc.pr.r.id = 'r1'
    pcc.pa.pc.append(copy.deepcopy(pc))
    pc.id = 'PC2'
    pc.pr.p.id = 'p2'
    pc.pr.v.id = 'v2'
    pc.pr.r.id = 'r2'
    pcc.pa.pc.append(copy.deepcopy(pc))    
    print('PCC-> ' , vars(pcc))
    print('t PA-> ' , vars(pcc.pa))
    #print(pcc.has_producer_agreement.clauseAlgorithme)
    x = PC()
    for x in pcc.pa.pc:
        print('tt PC-> ' , vars(x))
        print('ttt PT')
        print('ttt ->P ' , x.pr.p.id)
        print('ttt ->V ' , x.pr.v.id)
        print('ttt ->R ' , x.pr.r.id)

您正在使用类属性,这些属性总是在实例之间共享。copy.deepcopy()只复制实例属性。

使用__init__方法来创建实例属性:

class PT:    
    def __init__(self):
        self.v = V()
        self.p = P()
        self.r = R()
class PC(C):
    def __init__(self):
        self.pr = PT()
class A:
    id = ''
    def __init__(self):
        self.o = O()
class PA(A):
    def __init__(self):
        self.pc = []
class PCC(CC):
    def __init__(self):
        self.pa = PA()

最新更新