Python copy & deeocopy 探究
简单来说,copy 复制创建新的容器,而引用容器内元素的地址不变。而 deepcopy 也对容器内的容器元素进行复制。
但是这种复制具体是什么体现呢?是否只是对第一层容器元素进行了复制?写了一段代码验证。
from collections.abc import Iterable from pprint import pprint from copy import deepcopy def get_id(obj): if isinstance(obj, Iterable): return tuple((id(i), get_id(i)) for i in obj) else: return None ls = [1, 1, [2, 22], [3, [3, 33]]] ids = lambda obj: pprint((id(obj), get_id(obj))) ids(ls) ids(ls.copy()) ids(deepcopy(ls))
(139690047990528, ((139690060546288, None), (139690060546288, None), (139690050031936, ((139690060546320, None), (139690060546960, None))), (139690048039680, ((139690060546352, None), (139690048043392, ((139690060546352, None), (139690060547312, None))))))) (139690048041088, ((139690060546288, None), (139690060546288, None), (139690050031936, ((139690060546320, None), (139690060546960, None))), (139690048039680, ((139690060546352, None), (139690048043392, ((139690060546352, None), (139690060547312, None))))))) (139690048041088, ((139690060546288, None), (139690060546288, None), (139690048039808, ((139690060546320, None), (139690060546960, None))), (139690047983488, ((139690060546352, None), (139690050043008, ((139690060546352, None), (139690060547312, None)))))))
结论:
- 数字类型元素的引用地址始终不变,同一个数字可被多次引用。
- copy 只改变了最外层列表的地址,内部元素均相同。
- deepcopy 改变了最外层以及内部所有列表(包括列表元素的列表元素)的地址。
ls.copy()
和deepcopy(ls)
的地址相同,猜测原因是程序中ls.copy
返回的数据在打印结束后没有被使用了,便被销毁,同一个地址又用来存储deepcopy(ls)
返回的结果。
标签:
python
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)