Python: 复制的对象仍与原始对象发生变化

Python: Copied object still changed with original

我在 python 中复制对象时遇到问题。实际问题是在更改复制对象的变量时更改了原始对象的某些变量。但这仅适用于部分变量而不适用于所有变量。

简单地说,在显示代码之前我想进一步解释一下。我有两个参数 (pm) 对象,其中包含其他对象。一个参数对象为原始参数对象,不随时调整。它的副本版本已调整。如果我想再次获得默认的 values/objects ,我从参数复制对象中删除对象并从参数原始对象中添加默认对象。在这种情况下,我想删除调整后的组件并添加默认组件。

示例如下(用打印件显示问题):

    print('copy')
    for component in self.pm_object_copy.get_specific_components(component_type='conversion'):
        print(component.get_inputs())
        print(component.get_max_p())
        break

    print('original')
    for component in self.pm_object_original.get_specific_components(component_type='conversion'):
        print(component.get_inputs())
        print(component.get_max_p())
        break

    print('Adjust copied component')
    for component in self.pm_object_copy.get_specific_components(component_type='conversion'):
        component.add_input('a', 12)
        component.set_max_p(95)
        break

    print('copy')
    for component in self.pm_object_copy.get_specific_components(component_type='conversion'):
        print(component.get_inputs())
        print(component.get_max_p())
        break

    print('original')
    for component in self.pm_object_original.get_specific_components(component_type='conversion'):
        print(component.get_inputs())
        print(component.get_max_p())
        break

    # Now remove components from copy pm_object
    for component in self.pm_object_copy.get_specific_components(component_type='conversion'):
        self.pm_object_copy.remove_component_entirely(component.get_name())

    # Add copied component from original pm_object to copy pm_object
    for component in self.pm_object_original.get_specific_components(component_type='conversion'):
        copied_component = component.__copy__()
        self.pm_object_copy.add_component(component.get_name(), copied_component)

    print('After Copy')
    print('copy')
    for component in self.pm_object_copy.get_specific_components(component_type='conversion'):
        print(component.get_inputs())
        print(component.get_max_p())
        break

    print('original')
    for component in self.pm_object_original.get_specific_components(component_type='conversion'):
        print(component.get_inputs())
        print(component.get_max_p())
        break

    print('Adjust copied component')
    for component in self.pm_object_copy.get_specific_components(component_type='conversion'):
        component.add_input('a', 12)
        component.set_max_p(95)
        break

    print('copy')
    for component in self.pm_object_copy.get_specific_components(component_type='conversion'):
        print(component.get_inputs())
        print(component.get_max_p())
        break

    print('original')
    for component in self.pm_object_original.get_specific_components(component_type='conversion'):
        print(component.get_inputs())
        print(component.get_max_p())
        break

现在的问题是,从pm_object_original复制后,如果我更改复制的组件,原始组件(在pm_object_orginial中)也会发生变化。附上打印结果。

copy
{}
1.0

original
{}
1.0

Adjust copied component

copy
{'a': 12}
95.0

original
{}
1.0

After Copy
copy
{}
1.0

original
{}
1.0

Adjust copied component

copy
{'a': 12}
95.0

original
{'a': 12}
1.0

我真的很困惑为什么这只影响输入而不影响其他变量,如 max_p。我的复制代码如下所示:

    def __copy__(self, name=None, nice_name=None):

    if name is None:
        name = self.name
    if nice_name is None:
        nice_name = self.nice_name

    return ConversionComponent(name=name, nice_name=nice_name, lifetime=self.lifetime,
                               maintenance=self.maintenance, capex=self.capex, capex_unit=self.capex_unit,
                               scalable=self.scalable, base_investment=self.base_investment,
                               base_capacity=self.base_capacity, economies_of_scale=self.economies_of_scale,
                               max_capacity_economies_of_scale=self.max_capacity_economies_of_scale,
                               ramp_down=self.ramp_down, ramp_up=self.ramp_up,
                               shut_down_ability=self.shut_down_ability, shut_down_time=self.shut_down_time,
                               start_up_time=self.start_up_time, number_parallel_units=self.number_parallel_units,
                               min_p=self.min_p, max_p=self.max_p, inputs=self.inputs, outputs=self.outputs,
                               main_input=self.main_input, main_output=self.main_output, streams=self.streams,
                               final_unit=self.final_unit)

列表按引用传递,而不是按值传递。

您可以导入并使用 deepcopy(),或者您可以使用列表理解来创建副本。

list_copy = [elem for elem in original_list]