1、深浅拷贝
1.1 赋值【数据完全共享】
在Python中,当你将一个可变对象赋值给一个新的变量时,实际上是在创建这个对象的一个新引用(而不是对象的副本)。这意味着两个变量现在都指向内存中的同一个对象。因此,如果你通过任何一个变量对这个对象进行修改,这些修改将会影响到对象本身,进而影响到所有指向该对象的变量。
原数据发生变化, 赋值过的数据也会跟着一起变化。
# 示例
data = [1, 2, 3]
data2 = data # 赋值
# id():查看对象的内存地址
print("data:", data, id(data))
print("data2:", data2, id(data2))
print(id(data) == id(data2)) # True
# 往 data 中添加数据4
data.append(4)
# 往 data2 中添加数据5
data2.append(5)
print("data:", data)
print("data2:", data2)copy 模块提供了两种主要的拷贝方法:浅拷贝(copy())和深拷贝(deepcopy())。
1.2 浅拷贝【数据半共享】
在Python中,浅拷贝会创建一个新的对象,但这个新对象只拷贝了原始对象的第一层数据。如果原始对象包含嵌套的可变对象(如列表、字典等),浅拷贝后的新对象将不会复制这些嵌套对象,而是仅仅复制了它们的引用(即内存地址)。这意味着,新对象和原始对象会共享这些嵌套层的可变对象。因此,对通过浅拷贝得到的对象中的嵌套层进行修改,也会影响到原始对象中的相应部分。
# 示例
import copy
li = [1, [2]]
li2 = copy.copy(li) # 浅拷贝
print("li:", li, id(li))
print("li2:", li2, id(li2))
print(id(li) == id(li2)) # False ==> 内存地址不同 ==> 是不同的对象 ==> 操作不共享
li2.append(3)
print("li:", li) # 未发生变化
print("li2:", li2) # 发生变
# 往嵌套层操作
li[1].append(4)
print("li:", li) # 发生变化
print("li2:", li2) # 发生变
print(id(li[1]) == id(li2[1])) # True ==> 嵌套层内存地址相同 ==》是同一个对象 ==》 操作共享1.3 深拷贝【数据完全不共享】
在Python中,深拷贝是指创建一个新的对象,并且递归地复制原对象中包含的对象,直到所有的对象都被复制。这样,原对象和深拷贝后的对象在内存中是完全独立的,对深拷贝对象的修改不会影响到原对象。
# 示例
import copy
li = [1, [2]]
li2 = copy.deepcopy(li) # 深拷贝
print("li:", li, id(li))
print("li2:", li2, id(li2))
print(id(li) == id(li2)) # False
# 外层内存地址不同 ==》 不同的对象 ==》 操作不共享
li.append(3)
print("li:", li) # 发生变化
print("li2:", li2) # 未发生变化
print(id(li[1]) == id(li2[1])) # False
# 内层内存地址不同 ==》 不同的对象 ==》 操作不共享
li2[1].append(4)
print("li:", li) # 未发生变化
print("li2:", li2) # 发生变化著作权归文章作者所有。 未经作者允许禁止转载!