我遇到了一些我觉得不是很难的问题,但我找不到任何答案。
我有两个对象列表,每个对象都包含另一个对象列表。我想复制它们以进行测试并在重复该过程之前评估结果。最后,我会保持最好的结果。
然而,当复制每个列表时,结果不出所料,不是两个依赖列表,而是两个不再交互的列表。我怎么解决这个问题?有没有正确的方法呢?
鉴于两个类定义如下。
import copy
class event:
def __init__(self, name):
self.name = name
self.list_of_persons = []
def invite_someone(self, person):
self.list_of_persons.append(person)
person.list_of_events.append(self)
class person:
def __init__(self, name):
self.name = name
self.list_of_events = []
我试着写一些我所面临的情况的简单例子。 print函数显示两个列表中的对象标识符不同。
# Create lists of the events and the persons
the_events = [event("a"), event("b")]
the_persons = [person("x"), person("y"), person("z")]
# Add some persons at the events
the_events[0].invite_someone(the_persons[0])
the_events[0].invite_someone(the_persons[1])
the_events[1].invite_someone(the_persons[1])
the_events[1].invite_someone(the_persons[2])
print("Original :", id(the_persons[1]), id(the_events[0].list_of_persons[1]), id(the_events[1].list_of_persons[0]))
# Save the original configuration
original_of_the_events = copy.deepcopy(the_events)
original_of_the_persons = copy.deepcopy(the_persons)
for i in range(10):
# QUESTION: How to make the following copies?
the_events = copy.deepcopy(original_of_the_events)
the_persons = copy.deepcopy(original_of_the_persons)
print(" i =", i, ":", id(the_persons[1]), id(the_events[0].list_of_persons[1]), id(the_events[1].list_of_persons[0]))
# Do some random stuff with the two lists
# Rate the resulting lists
# Record the best configuration
# Save the best result in a file
我考虑使用一些字典并使列表独立,但这意味着我想避免许多代码修改。
提前感谢您的帮助!我是Python和StackExchange的新手。
答案 0 :(得分:0)
由于deepcopy会复制正在复制的东西的所有底层对象,因此对deepcopy执行两次独立调用会破坏对象之间的链接。如果你创建一个新对象,引用这两个东西(如dict)并复制该对象,那将保留对象引用。
workspace = {'the_persons': the_persons, 'the_events': the_events}
cpw = copy.deepcopy(workspace)