再理解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,可变对象,不可变对象,深拷贝,浅拷贝
原文地址:https://www.cnblogs.com/lyzz1314/p/12591839.html