如何判断Python函数返回对象是copy浅拷贝还是deepcopy深拷贝
判别copy与deepcopy返回结果的实现方法
核心判断逻辑基于两种拷贝的底层实现差异:
- 浅拷贝(
copy)仅复制容器的顶层结构,内部嵌套的可变子对象仍和原对象共享同一内存地址 - 深拷贝(
deepcopy)会递归复制所有层级的可变对象,所有子对象的内存地址均与原对象独立
基于该特性可以实现无副作用的判断,不需要修改原对象或拷贝对象的内容:
方法1:指定嵌套可变对象ID对比(适合已知结构的场景)
对于你给出的嵌套列表示例,直接对比嵌套的可变子对象ID即可,代码实现如下:
# 对比原列表与拷贝对象的嵌套子列表ID if id(some_list[-1]) == id(copied_list[-1]): print("当前为浅拷贝(copy)结果") else: print("当前为深拷贝(deepcopy)结果")
该方法执行速度最快,无任何额外开销,适合生产环境使用。
方法2:通用递归判断(适配未知结构的对象)
如果无法提前预知对象的嵌套结构,可以写递归逻辑遍历所有层级的可变对象进行判断,代码实现如下:
from collections.abc import MutableSequence, MutableMapping, MutableSet def check_copy_type(original_obj, copied_obj): # 先排除完全未拷贝的情况 if id(original_obj) == id(copied_obj): raise ValueError("输入对象未进行拷贝操作") # 递归校验可变子对象 def _check_sub_obj(o, c): if isinstance(o, (MutableSequence, MutableMapping, MutableSet)): if id(o) == id(c): return True # 遍历对应类型的元素 if isinstance(o, MutableSequence): for o_item, c_item in zip(o, c): if _check_sub_obj(o_item, c_item): return True elif isinstance(o, MutableMapping): for (o_k, o_v), (c_k, c_v) in zip(o.items(), c.items()): if _check_sub_obj(o_k, c_k) or _check_sub_obj(o_v, c_v): return True elif isinstance(o, MutableSet): for o_item, c_item in zip(o, c): if _check_sub_obj(o_item, c_item): return True return False is_shallow = _check_sub_obj(original_obj, copied_obj) return "浅拷贝(copy)" if is_shallow else "深拷贝(deepcopy)" # 调用示例 print(check_copy_type(some_list, copied_list))
注意事项
- 不可变对象(整数、字符串、元组等)存在Python内存复用机制,ID相同属于正常情况,不能作为判断拷贝类型的依据
- 相比修改嵌套元素观察同步变化的方案,ID对比法不会修改对象内容,不会污染原对象状态,适用所有场景
内容的提问来源于stack exchange,提问作者davi1ta
相关产品推荐
相关产品推荐

