【问题标题】:What is reference stealing and borrowing ?什么是参考窃取和借用?
【发布时间】:2021-12-08 21:54:27
【问题描述】:

在阅读 Python C/API 文档时,有些术语指的是引用窃取和借用。它们是什么意思?

【问题讨论】:

  • 参见docs.python.org/2/c-api/intro.html - 在引用计数/详细信息下。很清楚,IMOHO 和我的“答案”只是此类文档的摘录。是否有关于此类术语的具体问题?
  • 这个问题似乎是题外话,因为它可以在 Python 文档中查看:docs.python.org/2/c-api/intro.html - 在参考计数/详细信息下跨度>

标签: python python-2.7 python-3.x


【解决方案1】:

正如用户 2864740 评论的那样,这些术语在 Python C API 文档的“简介”页面的Reference Count Details section 中定义。以下是相关段落:

Python/C API 中函数的引用计数行为最好用引用的所有权来解释。所有权与引用有关,从不与对象有关(对象不拥有:它们始终是共享的)。 “拥有引用”意味着当不再需要引用时,负责在其上调用 Py_DECREF。所有权也可以转移,这意味着接收引用所有权的代码然后负责最终通过在不再需要时调用 Py_DECREF() 或 Py_XDECREF() 来减少它 - 或将此责任传递给它(通常给它的调用者)。当一个函数将引用的所有权传递给它的调用者时,调用者就被称为接收到一个新的引用。当没有所有权转移时,调用者被称为借用了引用。借来的参考资料不需要做任何事情。

相反,当调用函数传入对对象的引用时,有两种可能性:该函数窃取对该对象的引用,或者没有。窃取引用意味着当您将引用传递给函数时,该函数假定它现在拥有该引用,并且您不再对它负责。

【讨论】:

  • 那么在传递对函数的引用时,是“偷”还是“借”?如果调用函数增加了 ref 计数器,在这种情况下会调用什么?
  • 增加引用计数会将借用的引用变成您自己拥有的引用。很多代码都会做到这一点。如果您窃取了调用者传递给您的引用,则很少需要增加引用计数,因为您已经拥有您拥有的引用。这样做意味着您拥有对该对象的 两个 引用。只有在你放弃其中一个引用之前,通过将它传递给 其他一些 函数来窃取你的引用,这才是真正有用的。
  • 谢谢,无论哪种情况,它都可以作为后续操作发生。从借来的参考资料中,增加 ref_cnt 可以使操作安全,并且是一种常见的做法。并且从被盗的引用中,很少增加 ref_cnt 但在某些情况下仍然使用。 @Blckknght
猜你喜欢
  • 2012-05-02
  • 2015-06-28
  • 2018-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-17
相关资源
最近更新 更多