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]
我在 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]