python类的赋值操作和浅拷贝

变量的赋值

只是形成了两个变量,但是还是指向同一个对象,我们来看看代码

class SWS:
    pass

class SSN:
    pass

class C:
    def __init__(self, sws, ssn):
        self.sws = sws
        self.ssn = ssn

#(1)变量的赋值操作
sws_0 = SWS()
sws_1 = sws_0
print(sws_0)
print(sws_1)

######
<__main__.SWS object at 0x0000022230273FD0>
<__main__.SWS object at 0x0000022230273FD0>

我们可以看到两个变量的地址都是一模一样的,在这里变量的赋值其实就是和C语言里面的指针赋值差不多,都是指向同一个对象,如图所示

 浅拷贝

python的拷贝一般都是浅拷贝,拷贝时,对象包含的子对象内容不拷贝,因此,源对象与拷贝对象会引用同一个子对象,那这句话是什么意思呢,一起来看一下

#(2)类的浅拷贝
ssn = SSN()
c = C(sws_0, ssn)

import copy
print(ssn)
c_2 = copy.copy(c)
print(c, c.sws, c.ssn)
print(c_2, c_2.sws, c_2.ssn)

######
<__main__.SSN object at 0x0000022230273FA0>
<__main__.C object at 0x0000022230273F70> <__main__.SWS object at 0x0000022230273FD0> <__main__.SSN object at 0x0000022230273FA0>
<__main__.C object at 0x0000022230273D90> <__main__.SWS object at 0x0000022230273FD0> <__main__.SSN object at 0x0000022230273FA0>

在输出当中我们就可以看到啊c和c_2的地址不一样呀,但是怎么后面的子对象地址不一样呢

这就是呀,我们利用浅拷贝的方法使得c和c2都成为了C的实例对象,但是他们内部的子对象sws和ssn却都是指向同一个SWS和SSN的实例对象

posted @ 2022-12-12 16:09  放氮气的蜗牛  阅读(8)  评论(0编辑  收藏  举报  来源