当列表存放同一个类的多个相同实例时,deepcopy的执行行为是怎样的?
Python deepcopy对列表中重复实例引用的处理逻辑
结论
Python 标准库的copy.deepcopy()仅会为同一个原始类实例创建1份新的副本实例,后续遍历到其他指向该原始实例的引用时,会直接复用已生成的新副本赋值,不会重复创建新实例。
实现原理
deepcopy 内部维护了一个名为memo的字典映射,用于记录已经完成拷贝的「原始对象内存地址」和「对应新生成的副本对象」的对应关系。每次执行拷贝操作前,都会先查询memo字典,如果待拷贝的原始对象已经存在映射记录,会直接返回已生成的副本对象,跳过拷贝逻辑。
验证代码
你可以通过以下代码自行验证该行为:
import copy class TestClass: pass # 构造含重复引用的原始列表 origin_obj = TestClass() origin_list = [origin_obj, origin_obj] # 打印原列表两个元素的内存地址,确认指向同一个实例 print(f"原列表两个元素id是否相同:{id(origin_list[0]) == id(origin_list[1])}") # 执行深拷贝 copied_list = copy.deepcopy(origin_list) # 验证拷贝后列表的引用关系 print(f"拷贝后列表两个元素id是否相同:{id(copied_list[0]) == id(copied_list[1])}") print(f"拷贝后实例与原实例id是否不同:{id(copied_list[0]) != id(origin_obj)}")
运行输出
原列表两个元素id是否相同:True 拷贝后列表两个元素id是否相同:True 拷贝后实例与原实例id是否不同:True
输出结果可以证明:深拷贝后的列表仍然保留了和原列表一致的重复引用关系,仅生成了1份新的类实例。
内容的提问来源于stack exchange,提问作者user10725691
相关产品推荐
相关产品推荐

