zoukankan      html  css  js  c++  java
  • Python深拷贝和浅拷贝解读

    前言

    首先在之前的基础学习中并没有接触到深拷贝和浅拷贝的知识,但是随着我的不断深入学习,发现了很多的更细的知识点需要补充。
    在了解深拷贝和浅拷贝之前有必要来提及一下对象的比较,也就是'=='和'is'的判断。

    对比

    is和==做为判断条件,我们经常使用,比如

    if a == b || a is b:
      pass
    

    在之前未了解深拷贝和浅拷贝时,对于我的理解就是判断2个对象的值相等。但是实际内部的判断并非如此。

    a = 1
    b = 1
    a == b
    a is b
    


    因为它们的值是相等的,所以判断均为True,但是这并不能说明所有的现象,看下面例子

    a = 257
    b = 257
    a == b 
    a is b
    


    这里的is判断出现了F,是不是和之前的结果不一致呢?事实上,出于对性能优化的考虑,Python 内部会对 -5 到 256 的整型维持一个数组,起到一个缓存的作用。这样,每次你试图创建一个 -5 到 256 范围内的整型数字时,Python 都会从这个数组中返回相对应的引用,而不是重新开辟一块新的内存空间,但是如果超过这个区间,python就会重新分配新的内存地址。

    看到这里我们应该了解了is和 == 的区别,==是像我之前理解的一致,判断值是否相等。is则是判断ID。

    浅拷贝

    copy.copy(x)

    import copy
    a = {1:[1,2,3]}
    b = copy.copy(a)
    c = a
    print('a:',a)
    print('b:',b)
    print('c:',c)
    a[1].append(4)
    print('a:',a)
    print('b:',b)
    print('c:',c)
    a[2] = (4,5)
    print('a:',a)
    print('b:',b)
    print('c:',c)
    print('id(a) = ',id(a))
    print('id(b) = ',id(b))
    print('id(c) = ',id(c))
    

    c = a: 赋值引用,a 和 c 都指向同一个对象,内存地址相同。
    个人理解:只要a的值发生变化,c一定跟着a发生变化。

    b = copy.copy(a): 浅拷贝, a 和 b 是一个独立的对象(内存地址不同),但他们的子对象还是指向统一对象(是引用)。
    个人理解:如果a的某个子对象是可变对象那么这个子对象发生变化时,b也会发跟着发生变化,如果a的某个子对象是不可变对象,那么这个不可变子对象发生改变不会影响到b

    深拷贝

    copy.deepcopy(x)

    import copy
    a = {1:[1,2,3]}
    b = copy.deepcopy(a)
    c = a
    print('a:',a)
    print('b:',b)
    print('c:',c)
    a[1].append(4)
    print('a:',a)
    print('b:',b)
    print('c:',c)
    a[2] = (4,5)
    print('a:',a)
    print('b:',b)
    print('c:',c)
    print('id(a) = ',id(a))
    print('id(b) = ',id(b))
    print('id(c) = ',id(c))
    


    b = copy.deepcopy(a): 深度拷贝, a 和 b 完全拷贝了父对象及其子对象,两者是完全独立的。
    个人理解:无论a的值怎么变化始终不会影响到b

  • 相关阅读:
    用IntelliJ IDEA 开发Spring+SpringMVC+Mybatis框架 分步搭建一:建立MAVEN Web项目
    jvm学习笔记二(减少GC开销的建议)
    jvm学习笔记一(垃圾回收算法)
    【转】 StringUtils中 isNotEmpty 和isNotBlank的区别
    单例模式
    工厂模式
    个人项目作业
    第一次作业-热身!
    第四单元总结
    第三单元总结
  • 原文地址:https://www.cnblogs.com/huny/p/14472779.html
Copyright © 2011-2022 走看看