Python的copy&deepcopy

在 Python 中有一个比较坑的知识点,那就是 Python 的 浅拷贝(copy)和 深拷贝(deepcopy),对复合对象(列表、实例对象等)进行拷贝时,浅拷贝和深拷贝会存在很大差异。当然,对于一些简单类型,例如,int,float,string 等类型浅拷贝和深拷贝没有差异,因为这些类型实在是没有深度,在详细讲解浅拷贝和深拷贝之前,我们先引入手术刀函数:id(),该函数可以辅助我们实验,透过表象看到内存地址:

def assign_demo():
    # 先来个赋值操作
    a = [1, 2, 3]
    b = a
    # 可以得到a在硬盘中的索引
    print(id(a))  # 2234648998280
    # b在硬盘中的索引,会发现a和b的索引是一样的。也就是说指向了硬盘中的同一块区域
    print(id(b))  # 2234648998280


def main():
    assign_demo()


if __name__ == '__main__':
    main()

以上,我们总结一下,赋值操作只是将元素或者容器的地址拷贝给新变量或者容器,并不开辟新的内存空间!

浅拷贝示例:

def copy_demo():
    import copy
    c = [1, 3, [55, 32]]
    d = copy.copy(c)
    print(id(c))  # 2165464565896
    print(id(d))    # 2165464940872
    print(id(c[2]))  # 2165464874248
    print(id(d[2]))  # 2165464874248


def main():
    # assign_demo()
    copy_demo()


if __name__ == '__main__':
    main()

以上,我们可以总结一下,浅拷贝是在另一块内存地址中创建一个新的变量或者容器,但是容器内的元素地址均是源容器中元素地址的拷贝。也就是传说中的换了个新包装!

深拷贝示例:

def deepcopy_demo():
    import copy
    e = [1, 3, [55, 32]]
    f = copy.deepcopy(e)
    print(id(e))    # 2525424392520
    print(id(f))    # 2525424763208
    print(id(e[2])) # 2525424696648
    print(id(f[2])) # 2525424763144
    print(id(e[2][0]))  # 1409189680
    print(id(f[2][1]))  # 1409188944


def main():
    # assign_demo()
    # copy_demo()
    deepcopy_demo()


if __name__ == '__main__':
    main()

以上,我们可以总结一下,深拷贝是在另一块内存地址中创建一个新的变量或者容器,同时新容器内元素的地址与源容器内元素的地址也是新开辟的内存区域,是真正意义上的由内而外的革新!

你可能感兴趣的:(Python的copy&deepcopy)