为什么我需要深拷贝?

why do I need deepcopy?

我正在 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, dc, env))

如果我不对 generate_event 函数中的对象进行深层复制,每当我更改一个对象中的字段时,我在第一个对象之后创建的其他对象都会看到更改。 deepcopy函数是一个time-wise heavy function,使整个模拟器变慢。

我的问题是对象应该是独立的并且不应该共享相同的引用。我在这里遗漏了什么吗?

您似乎不需要深拷贝。只需将 req_old 命名为要求:

def generate_event(req, dc, env, event_type):
  req.rtype = event_type
  req.set_startTime(env.now)
  event = env.process(readReqEvent(req, dc, env))

... whenever I change a field in one object, the other objects that I create after the first one, will see the change"

这意味着它们实际上都是同一个对象。您有多个指向同一对象的引用,而不是对多个对象的多个引用。深度复制通过确保您有多个可以独立操作的对象来解决这个问题。

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