zoukankan      html  css  js  c++  java
  • python中浅拷贝和深拷贝的区别

    浅拷贝调用copy模块下的copy()方法-----> b = copy.copy(a) #a为初始对象,b为浅拷贝对象

    深拷贝调用copy模块下的deepcopy()方法------> b = copy.deepcopy(a) #a为初始对象,b为深拷贝对象

    import copy
    list1 = [[1,2],'abc']
    list2 = copy.copy(list1)
    list3 = copy.deepcopy(list1)
    print('原始对象:' + str(list1) + '  #  其中第一个元素[1,2]为可变元素')
    print('原始对象地址:'+ str(id(list1)) + ' 可变元素对象地址:' + str(id(list1[0])))
    print('浅拷贝对象:' + str(list2))
    print('浅拷贝对象地址:'+ str(id(list2)) + ' 可变元素对象地址:' + str(id(list2[0])))
    print('深拷贝对象:' + str(list3))
    print('深拷贝对象地址:' + str(id(list3)) + ' 可变元素对象地址:' + str(id(list3[0])))
    list1[0].append(3)
    print('-------原始对象中的列表改变----------')
    print('改变后原始对象:' + str(list1))
    print('改变后原始对象地址:'+ str(id(list1)) + ' 可变元素对象地址:' + str(id(list1[0])))
    print('改变后浅拷贝对象:' + str(list2))
    print('改变后浅拷贝对象地址:'+ str(id(list2)) + ' 可变元素对象地址:' + str(id(list2[0])))
    print('改变后深拷贝对象:' + str(list3))
    print('改变后深拷贝对象地址:' + str(id(list3)) + ' 可变元素对象地址:' + str(id(list3[0])))
    View Code

    代码运行结果如下:

    可以看出浅拷贝和深拷贝后对象地址都会发生变化

    不同的是如果原始对象中有可变元素(如上图中的列表[1,2]),浅拷贝后可变元素地址一样,而深拷贝后可变元素地址不一样

    所以当初始对象中的可变元素发生改变时(如在列表中增加元素),浅拷贝对象也会发生变化,而深拷贝对象不会

    python的默认拷贝方式是浅拷贝,因为花费时间更短、使用内存更少、效率更高。


     详细点可以看:https://blog.csdn.net/bufengzj/article/details/90486991 

  • 相关阅读:
    LightOJ 1313
    LightOJ 1285
    [坑] treap
    HDU 4511 小明系列故事——女友的考验 (AC自动机+DP)
    ZOJ 3765 Lights (伸展树splay)
    HDU 4818 RP problem (高斯消元, 2013年长春区域赛F题)
    SGU 104. Little shop of flowers (DP)
    HDU 3472 HS BDC (混合图的欧拉路径判断)
    POJ 1386 Play on Words (有向图欧拉路径判定)
    微信小程序上架需要增值电信业务经营许可证ICP?
  • 原文地址:https://www.cnblogs.com/xiaocaiqa/p/12445837.html
Copyright © 2011-2022 走看看