什么是浅拷贝、深拷贝: ———理论来自python基础教程
在 Python 中,对象赋值实际上是对象的引用。当创建一个对象,然后把它赋给另一个变量的时候,Python 并没有拷贝这个对象,而只是拷贝了这个对象的引用,我们称之为浅拷贝。
在 Python 中,为了使当进行赋值操作时,两个变量互不影响,可以使用 copy 模块中的 deepcopy 方法,称之为深拷贝。
1、直接赋值
特点:父值与子值之间会随着一个值的改变而改变
标识id值一样
a=[1,2,3,4,5,[6,7]]
b=a
print(b)
a[0]=2
a[5][1]=8
print(a,b)
b[0]=3
b[5][1]=9
print(a,b)
print(id(a))
print(id(b))
result:
[1, 2, 3, 4, 5, [6, 7]]
[2, 2, 3, 4, 5, [6, 8]] [2, 2, 3, 4, 5, [6, 8]]
[3, 2, 3, 4, 5, [6, 9]] [3, 2, 3, 4, 5, [6, 9]]
35769480
35769480
2、浅拷贝—copy
特点:父值与子值之间在某种情况下会随着一个值的改变而改变(嵌套值会改变,如下)
子值改变则父值不改变(嵌套值还是会改变,如下)
标识id值不一样
import copy
a=[1,2,3,4,5,[6,7]]
b=a.copy() #这里可以使a.copy()或者copy.copy(a)
print(b)
a[0]=2
a[5][1]=8
print(a,b)
b[0]=3
b[5][1]=9
print(a,b)
print(id(a))
print(id(b))
result:
[1, 2, 3, 4, 5, [6, 7]]
[2, 2, 3, 4, 5, [6, 8]] [1, 2, 3, 4, 5, [6, 8]]
[2, 2, 3, 4, 5, [6, 9]] [3, 2, 3, 4, 5, [6, 9]]
40750152
40750472
a=[1,2,3,4,5,[6,7]]
b=a[:]
print(b)
a[0]=2
a[5][1]=8
print(a,b)
b[0]=3
b[5][1]=9
print(a,b)
print(id(a))
print(id(b))
result:
[1, 2, 3, 4, 5, [6, 7]]
[2, 2, 3, 4, 5, [6, 8]] [1, 2, 3, 4, 5, [6, 8]]
[2, 2, 3, 4, 5, [6, 9]] [3, 2, 3, 4, 5, [6, 9]]
40684360
40684680
3、深拷贝—deepcopy
特点:父值与子值之间互不相关,不会随着一个值改变而改变
标识id值不一样
import copy
a=[1,2,3,4,5,[6,7]]
b=copy.deepcopy(a)
print(b)
a[0]=2
a[5][1]=8
print(a,b)
b[0]=3
b[5][1]=9
print(a,b)
print(id(a))
print(id(b))
result:
[1, 2, 3, 4, 5, [6, 7]]
[2, 2, 3, 4, 5, [6, 8]] [1, 2, 3, 4, 5, [6, 7]]
[2, 2, 3, 4, 5, [6, 8]] [3, 2, 3, 4, 5, [6, 9]]
40356744
40357064