再理解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
参考: