问题描述
我正在使用 python3 上的 simpy 开发缓存模拟器。我创建了一个这样的请求对象:
req = Request(req_id,mapper_id,task,source,destination,path,req_offset,req_size,task.job.iotype)
并将其传递给以下函数:
def generate_event(req_old,dc,env,event_type):
req = copy.deepcopy(req_old)
del req_old
req.rtype = event_type
req.set_startTime(env.Now)
event = env.process(readReqEvent(req,env))
如果我不对 generate_event 函数中的对象进行深拷贝,则每当我更改一个对象中的字段时,我在第一个之后创建的其他对象都会看到更改。 deepcopy 函数是一个时间方向的重函数,会使整个模拟器变慢。
我的问题是对象应该是独立的,不应共享相同的引用。我在这里遗漏了什么吗?
解决方法
您似乎不需要深拷贝。只需将 req_old 命名为 req:
def generate_event(req,dc,env,event_type):
req.rtype = event_type
req.set_startTime(env.now)
event = env.process(readReqEvent(req,env))
,
...每当我更改一个对象中的字段时,我在第一个之后创建的其他对象都会看到更改"
这意味着它们实际上都是同一个对象。您有多个引用指向同一个对象,而不是多个对象的多个引用。 Deepcopying 通过确保您有多个可以独立操作的对象来解决这个问题。
如果您正在处理可变对象,则需要在关键步骤进行复制,以便每个消费者都能收到他们可以根据需要操作的自己的对象,或者将对象设为只读,并强制消费者根据需要制作副本(如果只有部分用户需要进行修改可能更好)。