You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何判断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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 13:06:07