Python学习汇总

Python深拷贝和浅拷贝
拷贝就是复制一个数据,所有的数据类型都可以被复制的
赋值(不是拷贝)
● 赋值:多个变量指向同一个对象(内存地址),修改其中一个会影响其他。

原始列表

a = [1, 2, [3, 4]]

引用赋值

b = a
print("修改前a:", a, "id:", id(a))
print("修改前b:", b, "id:", id(b))
print('-'*50)

修改ref

b.append(5)
b[2].append(5)
print("修改后b:", b, "id:", id(b))
print("修改后a:", a, "id:", id(a)) # a也被修改
浅拷贝
● 浅拷贝:创建一个新对象,其内容是原对象中元素的引用。对于不可变元素(如整数、字符串)没问题,但对于可变子对象(如列表、集合、字典),新对象和原对象会共享这些子对象。
● 使用 copy.copy() 进行浅拷贝
import copy

a = [1, 2, [3, 4]]
b = copy.copy(a) #浅拷贝
print("a:", a, "id:", id(a))
print("b:", b, "id:", id(b))
print("外层对象是否相同:", a is b ) # False # 检查外层对象是否相同
print("内部列表是否相同:", a[2] is b[2]) # True # 检查内部子对象是否相同
print('-'*50)

修改浅拷贝的外层列表元素

b[0] = 100
print("修改浅拷贝的外层元素后:")
print("a:", a, "id:", id(a)) # 不变
print("b:", b, "id:", id(b))
print('-'*50)

修改浅拷贝的内层列表元素

b[2].append(5)
print("修改浅拷贝的内层列表后:")
print("a:", a, "id:", id(a)) # a中的子列表被修改!
print("b:", b, "id:", id(b))
结论:浅拷贝的外层对象独立,但内层可变对象共享。

深拷贝
● 深拷贝创建一个新对象,并递归地复制原对象中所有子对象,生成完全独立的副本,新旧对象完全不共享任何可变对象。
● 使用copy.deepcopy()方法
import copy

a = [1, 2, [3, 4]]
b = copy.deepcopy(a) #深拷贝

print("a:",a , "id:",id(a))
print("b:",b , "id:",id(b))
print("外层列表是否相同:", a is b) # False # 检查外层对象是否相同
print("内部列表是否相同:", a[2] is b[2]) # False # 检查外层对象是否相同
print('-'*50)

修改深拷贝的外层列表元素

b[0] = 100
print("修改浅拷贝的外层列表后:")
print("a:", a, "id:", id(a)) # 不变
print("b:", b, "id:", id(b))
print('-'*50)

修改深拷贝的内层列表元素

b[2].append(5)
print("修改深拷贝的内层列表后:")
print("a:", a, "id:", id(a)) # 不变
print("b:", b, "id:", id(b))
结论:不管是可变与不可变的数据类型使用深拷贝,数据都会相互独立,互不影响

总结与建议
拷贝方式 实现方法 外层对象 内层可变对象 适用场景
赋值 = 共享 共享 需要多个变量指向同一对象时
浅拷贝 copy.copy() 独立 共享 对象无嵌套可变对象,或需要共享子对象时
深拷贝 copy.deepcopy() 独立 独立 需要完全独立的副本,避免任何意外修改
使用建议:
● 大多数情况下,如果对象结构简单且不需要修改,直接赋值即可。
● 如果需要对数据进行独立操作,特别是包含嵌套可变对象时,考虑深拷贝。

posted @ 2026-10-21 17:36  小宇麒  阅读(7)  评论(0)    收藏  举报