深拷贝和浅拷贝
约 338 字大约 1 分钟
2024-11-12
赋值操作
a = [1,2,3,['apple','banana']]
b = a
b[0] = 666
print(a) # [666,2,3,['apple','banana']]
print(b) # [666,2,3,['apple','banana']]a,b 指向同一块地址空间,b 变,则 a 变。
深拷贝
import copy
a = [1,2,3,['apple','banana']]
b = copy.deepcopy(a)
b[0] = 666
print(a) # [1,2,3,['apple','banana']]
print(b) # [666,2,3,['apple','banana']]b 是 a 的深拷贝对象,可以理解为 b 是 a 的副本,b 的改变不会影响 a
浅拷贝
a = [1,2,3,['apple','banana']]
b = a.copy()
b[0] = 666
print(a) # [1,2,3,['apple','banana']]
print(b) # [666,2,3,['apple','banana']]
b[0] = 1
b[3][0] = 'peach'
print(a) # [1,2,3,['peach','banana']]
print(b) # [1,2,3,['peach','banana']]b 是 a 的浅拷贝对象,a,b 指向的地址不一致,但是其内部对象地址是一致的,
当改变 b 中不可变对象,a 中不会发生改变;
当改变 b 中的可变对象,a 中会发生相应的改变
举例 1
ls1 = [1, 2, [3, 4], 5]
ls2 =ls1
ls3 = ls1[:]
ls4 = ls1.copy()
print(id(ls1)==id(ls2), id(ls3)==id(ls1), id(ls4)==id(ls1), id(ls1[2])==id(ls4[2]))
# Output: True False False True注
切片操作是一种浅拷贝
copy 模块提供两个主要函数:
copy.copy(obj):进行浅拷贝。
copy.deepcopy(obj):进行深拷贝。
