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

为何deepcopy无法拷贝对象动态添加的属性,该如何解决?

问题原因

pandas的DataFrame类自定义了__deepcopy__方法,原生深拷贝逻辑仅会复制框架内置的核心属性(比如数据存储块、索引、列名等官方预定义属性),用户后续动态挂载到实例上的自定义属性不属于预定义的拷贝范围,因此会在深拷贝时被直接忽略,导致拷贝后的实例找不到对应属性。

可落地解决方案
  • 方案1:使用pandas官方推荐的自定义元数据存储属性(推荐)
    高版本pandas提供了公开的attrs字典专门用来存储用户自定义元数据,存放在这里的属性会被pandas的深拷贝逻辑自动处理:
    import pandas as pd
    from copy import deepcopy
    frame_one = pd.DataFrame({'hello': [1,2,3], 'world': [4,5,6]})
    frame_one.attrs['name'] = 'foo' # 自定义属性存入attrs
    frame_two = deepcopy(frame_one)
    print(frame_two.attrs['name']) # 正常输出foo
    
  • 方案2:少量自定义属性手动同步
    如果自定义属性数量极少,可以在深拷贝完成后手动赋值同步:
    frame_one = pd.DataFrame({'hello': [1,2,3], 'world': [4,5,6]})
    frame_one.name = 'foo'
    frame_two = deepcopy(frame_one)
    frame_two.name = frame_one.name # 手动同步自定义属性
    print(frame_two.name) # 正常输出foo
    
  • 方案3:继承DataFrame自定义扩展类
    如果需要大量自定义属性,且希望保持直接挂在实例上的使用方式,可以通过pandas官方支持的_metadata扩展机制实现:
    import pandas as pd
    from copy import deepcopy
    
    class CustomDataFrame(pd.DataFrame):
        # 声明需要同步的自定义属性列表
        _metadata = ["name"]
        
        @property
        def _constructor(self):
            return CustomDataFrame
    
    frame_one = CustomDataFrame({'hello': [1,2,3], 'world': [4,5,6]})
    frame_one.name = 'foo'
    frame_two = deepcopy(frame_one)
    print(frame_two.name) # 正常输出foo
    

内容的提问来源于stack exchange,提问作者Pm740

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 03:57:03