【问题标题】:why do I need deepcopy?为什么我需要深拷贝?
【发布时间】:2021-05-04 14:15:53
【问题描述】:

我正在使用 Python3 上的 simpy 开发缓存模拟器。我这样创建一个 Request 对象:

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 函数是一个耗时的函数,会使整个模拟器变慢。

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

【问题讨论】:

  • 如果您希望您的对象是独立的并且不共享相同的引用,那么这就是您需要深度复制它们的原因。

标签: python deep-copy simpy


【解决方案1】:

您似乎不需要深拷贝。只需将 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, dc, env))

【讨论】:

    【解决方案2】:

    ...每当我更改一个对象中的字段时,我在第一个对象之后创建的其他对象都会看到更改”

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

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

    【讨论】:

    • 你是对的。结果发现对象中的某些字段共享相同的引用。通过改变我定义它们的方式,问题得到了解决,我不再需要 deepcopy。
    猜你喜欢
    • 2011-03-22
    • 1970-01-01
    • 1970-01-01
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-12
    相关资源
    最近更新 更多