Python3 deepcopy 的 memo 和 nil 参数的文档不完整和/或循环?

RBV*_*RBV 3 python-3.x

有没有人有 (a) 对copy.deepcopy()备忘录nil的解释,或(b)指向有关它们的真正信息文档的指针?

我在 Pydev 3.7.1 控制台中使用 Python 3.4.1 来试验copy.deepcopy。在 PyDev 控制台中,代码完成功能告诉我 deepcopy 的语法是deepcopy(x, memo=None, _nil=[])。我已经在使用x,但是memonil对我来说是新的。

到目前为止,我在这里查找有关这两个参数的信息:

  • Python 3.4.1 文档:https://docs.python.org/3/library/copy.html? highlight=deepcopy#copy.deepcopy 。这给了我只有copy.deepcopy(x) ——没有memonil

  • 在 PyDev 控制台中,>>> help(copy)。这为我提供了对任意 Python 对象的 Deepcopy(x, memo=None, _nil=[]) 深度复制操作。有关详细信息,请参阅模块的 __ doc __ 字符串。所以我接下来看...

  • D:\Python34\lib\copy.py的文档字符串。文档字符串让我参考文档字符串。叹...

  • copy.py的 333 行代码中。我承认,我还没有达到阅读代码就能获得信息的程度。

  • 在 StackOverflow 和 Web 上进行搜索。我设法找到了一些有关记忆化概念的通用信息(这显然是一种保留操作结果的方法,这样在下次调用时就不需要从头开始执行该操作)。我还发现了一些关于Python 2.4的信息,其中指出“参数 memo 和 nil 用于递归深度复制,它们的默认值是 None 和空列表”。(http://www.cheat-sheets.org/saved-copy/PQRC-2.4-A4-latest.pdf等)

引用的 2.4 备忘单让我猜测memonil可能用于限制 deepcopy 递归到源元素的嵌套子元素的深度。但这只是一个猜测。

所以我仍在寻找能够真正解释如何使用参数的东西。

(既然 Python 文档系统包含不完整的解释,我是否应该考虑提交文档错误?)

在此先感谢您的帮助。

use*_*ica 5

从文档的下方开始deepcopy

\n\n
\n

深复制操作通常存在两个问题,而浅复制操作不存在\xe2\x80\x99:

\n\n
    \n
  • 递归对象(直接或间接包含对自身的引用的复合对象)可能会导致递归循环。
  • \n
  • 因为深层复制会复制所有内容,因此可能会复制太多内容,例如,即使在副本之间也应该共享的管理数据结构。
  • \n
\n\n

deepcopy() 函数通过以下方式避免了这些问题:

\n\n
    \n
  • 保留在当前复制过程中已复制的对象的 \xe2\x80\x9cmemo\xe2\x80\x9d 字典;和
  • \n
  • 让用户定义的类覆盖复制操作或复制的组件集。
  • \n
\n\n

...

\n\n

为了让类定义自己的复制实现,它可以定义特殊的方法__copy__()__deepcopy__(). 前者被调用来实现浅拷贝操作;没有传递额外的参数。调用后者来实现深拷贝操作;它传递一个参数,即备忘录字典。如果__deepcopy__()实现需要对组件进行深层复制,则应调用该deepcopy()函数,并将该组件作为第一个参数,将备忘录字典作为第二个参数。

\n
\n\n

这就是目的memo。它会跟踪已经复制的内容。

\n\n

_nil是一个实现细节。它仅使用一次,作为memo.get呼叫的哨兵值。它是默认参数这一事实是一种微优化,将其设为默认参数所节省的少量时间可能不会超过在签名中看到它所带来的轻微混乱。

\n