zoukankan      html  css  js  c++  java
  • 再理解python深、浅拷贝,可变、不可变对象

    问题引入(转自https://www.cnblogs.com/blankdog/p/10070129.html)


    看了python深拷贝和浅拷贝的区别,还是对两个拷贝不太理解,并且那些id怎么理解,这就要牵扯到python到对象创建机制了。

    python中一切皆对象

    参考python可变对象和不可变对象python,可变对象,不可变对象,深拷贝,浅拷贝

    我的再理解

    • 用一句简单的话来说就是浅拷贝,只是对指针的拷贝,拷贝后两个指针指向同一个内存空间,深拷贝不但对指针进行拷贝,而且对指针指向的内容进行拷贝,经深拷贝后的指针是指向两个不同地址的指针。

    • set集合中的添加用update() , 删除用remove()

    • tp=(1,2)开辟了新的内存地址,改变该不可变对象需要创建新的内存地址,产生新的object

    • 对于某一个对象object,如字符串‘hello’,长时间没有变量指定,则垃圾回收机制会自动回收的。

    • 而可变对象是一组内存地址的指针集合,可变对象的改变不会改变可变对象本身的id

    • 正因为如此,当对一个可变对象进行深/浅拷贝的时候,我们要创建新的id,产生新的object,只不过shallow copy 产生的新obj里面的如果有指针的话,指针指向的obj2不会被拷贝(所以修改obj2的话,浅拷贝内容也会变化);
      当我们对一个不可变对象进行拷贝的时候,因为该对象是不可变的,变化时也是在新的内存地址上进行重新创建,所以深/浅拷贝只需指向同一个obj就可以了

    • 在除了tuple的不可变变量中,只要两个变量的数据类型相同并且值也相等,那么这两个变量的地址也相同(整数仅包括[-5,255]内的整数)
      上述不可变变量性质的优点在于减少了重复的值对内存空间的占用

    • 注意:当list用“+”来运算时会开辟新的内存空间a2 = a2 + [4]与a2 += [4] # 相当于调用了a2.extend([4]),原地改变并没有新的对象产生,参考https://blog.csdn.net/rookinzhang/article/details/80259857

    参考:

    1. 关于Python中的可变对象与不可变对象的区别
    2. python可变对象和不可变对象
    3. python深拷贝和浅拷贝的区别
    4. python,可变对象,不可变对象,深拷贝,浅拷贝
  • 相关阅读:
    spring boot 配置时区差别
    概率期望
    Euler函数与Euler定理
    素数&筛法
    等差子序列
    8.19 T2
    8.19 T1
    量化交易
    挺进

  • 原文地址:https://www.cnblogs.com/lyzz1314/p/12591839.html
Copyright © 2011-2022 走看看