Python:复制的对象仍然与原始对象相同



我有一个在python中复制对象的问题。实际的问题是,在改变被复制对象的变量时,会改变原对象的一些变量。但这只适用于一些变量,而不是所有的。

简要地说,在显示代码之前,我想进一步解释一下。我有两个参数(pm)对象,它们包含其他对象。其中一个参数对象为原始对象,不进行任何调整。调整副本版本。如果我想再次获得默认值/对象,我从参数复制对象中删除对象,并从参数原始对象中添加默认对象。在本例中,我想删除调整后的组件,并添加默认组件。

下面是示例(用打印显示问题):

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_original)会发生变化。附件是打印结果。

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]

最新更新