[Python]之深拷贝与浅拷贝
Python之深拷贝与浅拷贝
概述:
大白话解释就是 深拷贝拷贝的多, 浅拷贝拷贝的少.
-
深浅拷贝区别就是: 拷贝的层级的多与少.
-
深浅拷贝都能操作可变类型 和 不可变类型, 但是深浅拷贝一般操作的都是 可变类型, 几乎不会出操作不可变类型的.
-
可变类型 和 不可变类型的划分依据: 在不改变地址值的情况下, 元素值是否可以发生改变,
可以: 可变类型, 不可以: 不可变类型.
可变类型: 列表, 字典, 集合
不可变类型: 整型, 浮点型, 字符串, 布尔型, 元组 -
深浅拷贝指的是 copy模块下的不同的函数.
浅拷贝: copy.copy()
深拷贝: copy.deepcopy()
因为深浅拷贝主要针对的是可变类型,不可变类型拷贝还是同一个地址,所以下面通过一个简单的方式讲明白深浅拷贝的区别
a = [1, 2, 3]
b = [4, 5, 6]
c = [7, 8, 9, a, b]
d = c
print(id(c))
print(id(d))
当上面的代码执行后,我们发现c和d的地址是一样的,因为在python中 = 传递的是地址值,又因为python中list为可变类型,更改值并不会变更地址,所以,更改c的值的时候d的值也会被更改,那么如果我们想更改c而不更改d的时候怎么办呢?
这个时候就需要浅拷贝了
import copy
a = [1, 2, 3]
b = [4, 5, 6]
c = [7, 8, 9, a, b]
d = copy.copy(c)
print(id(c))
print(id(d))
此时我们发现,d和c的地址值不一样了,浅拷贝将一个新的地址值给了d并将c的内容加进去了
这个时候我们修改c,d里面除了a,b列表以外的值都不会有关联,但是,因为是浅拷贝,c d 里面复制的是ab的地址,这个时候修改c或d里面a,b的值,都会影响到另一个,可能会看不懂,这里代码试一下就明白了:
import copy
a = [1, 2, 3]
b = [4, 5, 6]
c = [7, 8, 9, a, b]
d = copy.copy(c)
print(id(c))
print(id(d))
print(c)
print(d)
print('-'* 30)
c[2] = 10
print(c)
print(d)
print('-'* 30)
c[3][0] = 5201314
print(c)
print(d)
运行结果如下:
这时聪明的小伙伴就理解了,深拷贝是将拷贝对象内部的地址内的内容也拷贝到新的地址
import copy
a = [1, 2, 3]
b = [4, 5, 6]
c = [7, 8, 9, a, b]
d = copy.deepcopy(c)
print(id(c))
print(id(d))
print(c)
print(d)
print('-'* 30)
c[2] = 10
print(c)
print(d)
print('-'* 30)
c[3][0] = 5201314
print(c)
print(d)
这个时候修改c内a的值就不会影响到d了