为什么我需要深拷贝?

问题描述

我正在使用 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 通过确保您有多个可以独立操作的对象来解决这个问题。

如果您正在处理可变对象,则需要在关键步骤进行复制,以便每个消费者都能收到他们可以根据需要操作的自己的对象,或者将对象设为只读,并强制消费者根据需要制作副本(如果只有部分用户需要进行修改可能更好)。