Python 深拷贝 vs 浅拷贝 90%的人都踩过这个坑
先看这段代码
a = [[1, 2], [3, 4]]
b = a
b[0][0] = 99
print(a)
猜猜输出什么?
没错,a 也被改了 变成了 [[99, 2], [3, 4]]
因为你以为在复制 其实只是贴了个标签
两个名字指向同一个对象
搞清楚这三个就够了👇
赋值 = 贴标签
浅拷贝 = 新瓶子装旧酒
深拷贝 = 里外全是新的
代码怎么写
浅拷贝
copy.copy(original)
或者 original[:]
或者 list(original)
深拷贝
copy.deepcopy(original)
面试最爱问 工作天天用
默认参数这个坑你肯定踩过👇
def add(item, lst=[]):
lst.append(item)
return lst
add(1) -> [1]
add(2) -> [1, 2] 数据被污染了
修复方法
def add(item, lst=None):
if lst is None:
lst = []
lst.append(item)
return lst
测试数据也要注意
from copy import deepcopy
class TestBase:
def setup_method(self):
self.data = deepcopy(TEST_DATA)
每人一份 互不污染
性能区别
赋值 最快
浅拷贝 快
深拷贝 慢几百倍
使用原则
一层数据用浅拷贝
多层嵌套用深拷贝
只读不改直接赋值
总结
赋值只是贴标签
浅拷贝新瓶子装旧酒
深拷贝里外全部独立
默认参数别写 [] 或 {}
测试数据用 deepcopy
深拷贝慢 按需用
#Python #编程 #程序员 #面试 #自学Python