对于不可变类型,浅拷贝和深拷贝没有区别
对于不可变类型
赋值
对象的赋值就是简单的对象引用
a = [1,2,"hello",[1,2]]
b = a
在上述情况下,a和b是一样的,他们指向同一片内存,b不过是a的别名,是引用.
我们可以使用b is a去判断,返回True,表明他们地址相同,内容相同,也可以使用id()函数来查看两个列表的地址是否相同
在内存的管理层面理解,只是添加了一个引用计数.
浅拷贝
浅拷贝会创建新对象,其内容非原对象本身的引用,而是原对象内第一层对象的引用
浅拷贝有三种形式:切片操作、工厂函数、copy模块的copy函数
比如上述的列表a
切片操作:b=a[:] 或者 b = [x for x in a]
工厂函数: b = list(a)
copy函数: b = copy.copy(a)
浅拷贝产生的列表b不再是列表a了,使用is判断可以发现他们不是一个对象,使用id查看他们也不指向同一片内存空间
,但是当我们使用id(x) for x in a 和 id(x) for x in b 来查看a和b中元素的地址时,
可以看到二者包含的元素的地址是相同的
深拷贝
深拷贝只有一种形式,copy模块的deepcopy()函数
深拷贝拷贝了对象的所有元素,包括多层嵌套的元素。因此它的时间和空间开销要高
如果使用b = copy.deepcopy(a),再修改b不会影响a,即使嵌套的列表具有更深的层次,也不会产生任何影响。
因为深拷贝拷贝出来的对象根本就是一个全新的对象,不再与原来的对象有任何关联。
网友评论