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的实例对象