在Python中复制对象的所有部分,但不包括其中一部分

4 投票
2 回答
3096 浏览
提问于 2025-04-18 06:06

在Python中,如何对一个对象进行copy.deepcopy(),但不包括其中的某一部分呢?

我有一个对象,它基本上是一个包装器,里面有一些设置和额外的元数据,围绕着一个可能非常大的pandas数据框(DataFrame)。这个数据框可以包含任意多的数据。我想要复制这个对象,但希望它包含一个数据框的浅拷贝和设置及元数据的深拷贝(这两个部分都可能是可变的对象)。

我在运行时并不知道在需要复制的时候,所有的设置和元数据是否都存在。另外,还有可能有人会通过my_object.extra_setting来设置对象的额外部分。这意味着我不能简单地对对象的所有部分进行深拷贝,只排除那个大的数据框。

这个类是:

    class my_class(object):

        def __init__(self, lots_of_data, small_amount_of_data, setting_1, setting_2, setting_3):
            self.lots_of_data = lots_of_data
            self.small_amount_of_data = small_amount_of_data
            self.setting_1 = setting_1
            self.setting_2 = setting_2

        def set_setting_3(self, setting_3):
            self.setting_3 = setting_3

        def set_more_metadata(metadata):
            self.more_metadata = metadata

而在伪代码中,复制的方法是:

        def __deepcopy__(self):

            copy_of_object = copy.deepcopy(self[all but object_in.lots_of_data])
            copy_of_object.lots_of_data = self.lots_of_data

            return copy_of_object

2 个回答

0

我怀疑你可能已经不再寻找答案了,但我在找答案的时候找到了这个解决方案,分享给大家。

import copy
def special_copy_function(object_to_be_copied: my_class) -> my_class:
    memo = {id(object_to_be_copied.lots_of_data): copy.copy(object_to_be_copied.lots_of_data)  # Shallow copy of large data file
    output = copy.deepcopy(object_to_be_copied, memo)  # Deep copy of everything else
    return output

memo 是一个字典,用来传递给 deepcopy,帮助它记住已经复制过的内容,这样就可以避免重复复制同一个项目(如果这个项目在多个地方被引用的话)。

通过把 lots_of_data 的一个浅拷贝放进 memo 字典里,deepcopy 就会使用这个值,而不是再去尝试深拷贝 lots_of_data 本身。

3

你的类需要实现 __deepcopy__() 这个方法,它的作用是选择哪些字段需要被复制。

撰写回答