在python中复制除了一个对象的所有部分

时间:2014-05-10 12:17:27

标签: python copy

如果copy.deepcopy()除了python中的一个对象的一部分外,怎么会这样?

我有一个对象,它基本上是一个包装器,带有一些设置和围绕潜在巨大的pandas DataFrame的一些额外的元数据。 DataFrame可以包含任意大量的数据。我想复制一个对象,该对象包含数据帧的浅层副本和设置和元数据的deepcopy()(两者都可以是可变对象)。

在运行时我不知道在需要复制时是否存在所有设置和元数据。人们也可以使用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 :(得分:3)

您的班级需要实施__deepcopy__(),这将选择要复制的字段。

答案 1 :(得分: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 本身。