Python深浅拷贝详细深入
赋值
赋值是对内存地址的引用
浅拷贝
浅拷贝就是额外在内存中创建第一层数据,注意第一层的意思是最外层的数据,然后第一层的数据仍然指向原来内存中的数据
浅拷贝是新建了子对象,仅仅拷贝了第一层的数据,但是内部的数据还是引用
最外层的数据
改变原始数据的最外层,深浅拷贝都已经拷贝了这一层,不会首影响,只有原来的数据改变
i1={'k3': ['hijack', 678], 'k2': 123, 'k1': 'hi'}
import copy
i2=copy.copy(i1)
i3=copy.deepcopy(i1)
>>> i1["k4"]="add_data_test"
>>> i2
{'k3': ['hijack', 678], 'k2': 123, 'k1': 'hi'}
>>> i3
{'k3': ['hijack', 678], 'k2': 123, 'k1': 'hi'}
>>> i1
{'k3': ['hijack', 678], 'k2': 123, 'k1': 'hi', 'k4': 'add_data_test'}
改变内层数据
浅拷贝仅仅没有涉及到内层的数据,会受影响
>>> i1["k3"].append("k3_test")
>>> i1
{'k3': ['hijack', 678, 'k3_test'], 'k2': 123, 'k1': 'hi', 'k4': 'add_data_test'}
>>> i2
{'k3': ['hijack', 678, 'k3_test'], 'k2': 123, 'k1': 'hi'}
>>> i3
{'k3': ['hijack', 678], 'k2': 123, 'k1': 'hi'}
>>>
深拷贝
深拷贝是创建完全新的内存地址,全部的都是新的
总结
copy.copy()得到的是新的对象,但是数据还是引用。要得到一个完全一样的对象,用copy.deepcopy()
面试题
import copy
a = [1,2,3,[4,5,],6]
b = a # b是对a的引用
c = copy.copy(a) # 浅拷贝
d = copy.deepcopy(a) # 深拷贝
b.append(10)
c[3].append(11)
d[3].append(12)
print(a) # [1,2,3,[4,5,11],6,10] # 改变了原始数据
print(b) # [1,2,3,[4,5,11],6,10] # 改变了原始数据
print(c) # [1,2,3,[4,5,11],6,] # 内层的数据是引用
print(d) # [1,2,3,[4,5,12],6,] # 新的对象
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步