这里写自定义目录标题
赋值、浅拷贝、深拷贝的区别
赋值 =
在 Python 中,对象的赋值就是简单的对象引用,赋值操作(包括对象作为参数、返回值)不会开辟新的内存空间,它只是复制了对象的引用。
a=[1,[2,3,'A'],4]
b=a
也就是说除了 b 这个名字之外,没有其他的内存开销。修改了 a,也就影响了 b,同理,修改了 b,也就影响了 a。
a=[1,[2,3,'A'],4]
b=a
a[0]=2
print(b)#结果:[2, [2, 3, 'A'], 4]
浅拷贝
浅拷贝的方式 : 切片操作 、工厂函数、 copy 模块中的 copy 函数
浅拷贝(shallow copy):浅拷贝会创建新对象,其内容非原对象本身的引用,而是原对象内第一层对象的引用。
如果在列表 a 中有一个嵌套的 list,如果我们修改了它,情况就不一样了。查看列表 b,会发现列表 b 也发生了变化,这是因为,我们修改了嵌 套的 list,修改外层元素,会修改它的引用,让它们指向别的位置,修改嵌套列表中的元素,列表的地 址并未发生变化,指向的都是用一个位置
import copy
# Create your tests here.
a=[1,[2,3,'A'],4]
b=copy.copy(a)
a[0]=2
print(b)#结果:[1, [2, 3, 'A'], 4]
a[1][2]='B'
print(b)#结果:[1, [2, 3, 'B'], 4]
深拷贝
深拷贝只有一种形式,copy 模块中的 deepcopy()函数。深拷贝和浅拷贝对应,深拷贝拷贝了对象的所有元素,包括多层嵌套的元素。因此,它的时间和空 间开销要高。同样的对列表 b,如果使用 b = copy.deepcopy(a),再修改列表 a 将不会影响到列表 b,即使嵌 套的列表具有更深的层次,也不会产生任何影响,因为深拷贝拷贝出来的对象根本就是一个全新的对象, 不再与原来的对象有任何的关联。
import copy
# Create your tests here.
a=[1,[2,3,'A'],4]
b=copy.deepcopy(a)
a[1][2]='B'
print(b)#结果:[1, [2, 3, 'A'], 4]
print(a)#结果:[1, [2, 3, 'B'], 4]
注意:
对于非容器类型,如数字、字符,以及其他的“原子”类型,没有拷贝一说,产生的都是原对象的引用。如果元组变量值包含原子类型对象,即使采用了深拷贝,也只能得到浅拷贝。