对象的浅拷贝和深拷贝_内存分析

变量的赋值操作
只是形成两个变量,实际还是指向同一个对象。

浅拷贝
Python 拷贝一般都是浅拷贝。拷贝时,对象包含的子对象内容不拷贝。因此,源对象和拷贝对象会引用同一个子对象。

深拷贝
使用 copy 模块的 deepcopy 函数,递归拷贝对象中包含的子对象。源对象和拷贝对象所有的子对象也不同。

import copy


class Mobilephone:
    def __init__(self,cpu,screen):
        self.cpu=cpu
        self.screen=screen


class CPU:
    def calulate(self):
        print("计算CPU,12345")
        print("CPU对象:",self)

class Screen:
    def show(self):
        print("显示画面")
        print("Screen对象:",self)


c = CPU()
s = Screen()
m1 = Mobilephone(c,s)

#测试变量赋值
m2 = m1
print(m1)
print(m2)
#结果:地址两个地址是一样的

#测试浅拷贝
print("浅拷贝")
m3 = copy.copy(m1)
print(m1,m1.cpu,m1.screen)
print(m3,m3.cpu,m3.screen)
#结果:只有m1 和 m3 本身的地址不同,对象里面的子对象即实例属性地址相同
# <__main__.Mobilephone object at 0x0000025AF8A773C8> <__main__.CPU object at 0x0000025AF8A772B0> <__main__.Screen object at 0x0000025AF8A77320>
# <__main__.Mobilephone object at 0x0000025AF8A777B8> <__main__.CPU object at 0x0000025AF8A772B0> <__main__.Screen object at 0x0000025AF8A77320>

#测试深拷贝
print("深拷贝")
m4 = copy.deepcopy(m1)
print(m1,m1.cpu,m1.screen)
print(m4,m4.cpu,m4.screen)
#结果:m1 和 m4 本身的地址不同,对象里面的子对象即实例属性地址也不同,说明子对象也进行了拷贝
# <__main__.Mobilephone object at 0x00000142D2F67320> <__main__.CPU object at 0x00000142D2F677F0> <__main__.Screen object at 0x00000142D2F672B0>
# <__main__.Mobilephone object at 0x00000142D2F677B8> <__main__.CPU object at 0x00000142D2F673C8> <__main__.Screen object at 0x00000142D2F67F60>

你可能感兴趣的:(对象的浅拷贝和深拷贝_内存分析)