一、赋值与引用
当你将一个变量赋值给另一个变量时,实际上是将一个对象的引用(内存地址)赋给了另一个变量,而不是创建了一个新的对象。因此,这两个变量将指向相同的内存地址,修改其中一个变量的值将会影响另一个变量的值。这适用于可变对象和不可变对象。
示例:
a = [1, 2, 3]
b = a # b引用了a的内存地址
b[0] = 5
print(a) # 输出:[5, 2, 3]
print(b) # 输出:[5, 2, 3]
二、拷贝创建副本
有时你想要复制一个对象而不是共享它,改变其中一个的值,另一个的值不受影响。这时候你可以创建一个副本。Python提供了多种方式来创建副本,包括切片操作、使用列表的copy()方法以及使用copy模块中的copy()函数。
注意:copy()方法只会创建一个浅拷贝,即只会复制顶层对象,而不会递归地复制嵌套对象。
示例:
#切片
a = [1, 2, 3]
b = a[:] # 使用切片操作创建a的副本给b
b[0] = 5
print(a) # 输出:[1, 2, 3]
print(b) # 输出:[5, 2, 3]###########################################
#使用copy
import copya = [1, 2, 3]
b = a.copy() # 使用列表的copy()方法创建a的副本给b
b[0] = 5
print(a) # 输出:[1, 2, 3]
print(b) # 输出:[5, 2, 3]
三、深度拷贝
有时候对象是嵌套的,而你想要创建一个完全独立的副本,即使原始对象是嵌套的,也不想共享任何内部对象。这时候你需要使用深度拷贝。深度拷贝会递归地复制所有嵌套对象。
示例:
import copya = [[1, 2], [3, 4]]
b = copy.deepcopy(a) # 使用深度拷贝创建a的副本给b
b[0][0] = 5
print(a) # 输出:[[1, 2], [3, 4]]
print(b) # 输出:[[5, 2], [3, 4]]