gpt4 book ai didi

python - python 总是同步调用 __del__ 吗?

转载 作者:太空宇宙 更新时间:2023-11-03 15:21:51 25 4
gpt4 key购买 nike

__del__ 的 Python 文档说明当对象的引用计数减少到零时,可以调用对象的 __del__ 方法。它总是立即调用(即同步)吗?或者 __del__ 方法是否有可能“在未来的某个时候”被调用?

此外,这个问题的答案一般适用于 Python 吗?还是授予语言实现一定的自由度? (我使用 CPython。)

对于这个问题,假设如下:

  • 有问题的对象继承自 object
  • 有问题的对象有一个自定义的 __del__ 实现。
  • 对象的自定义 __del__ 实现不会创建对任何对象的新引用。
  • 有问题的对象不是引用循环的一部分。
  • 解释器不在关闭过程中。

据我所知,围绕这个主题似乎存在很多困惑。为了回避一些不必要的讨论,让我举一些 Not Acceptable 答案的例子:

  • “不要使用 __del__!这很困惑!”
  • “不要使用 __del__!它不是‘pythonic’。”
  • “不要使用 __del__,而是使用上下文管理器。”
  • 在没有引用可靠来源的情况下断言什么是有保证或不能保证的任何答案。 (请随意引用其他 SO 答案,但不要将它们作为您的唯一来源。在这种情况下,“可信”意味着来自文档、有信誉的人,甚至可能是 CPython 源本身。)<

要用示例重新表述这个问题,请考虑以下代码:

class C(object):
def __init__(self, i):
self.i = i

def __del__(self):
print "C.__del__:", self.i

print "Creating list"
l = [C(0), C(1), C(2)]

print "Popping item 1"
l.pop(1)

print "Clearing list"
l = []

print "Exiting..."

产生以下输出:

$ python test_del.py
Creating list
Popping item 1
C.__del__: 1
Clearing list
C.__del__: 2
C.__del__: 0
Exiting...

请注意,在此示例中,__del__ 被同步调用。这种行为是由语言保证的吗? (请记住上面列出的假设。)

最佳答案

来自 Python 语言引用(Python 2.7.3 版),Chapter 3, Data model :

Objects are never explicitly destroyed; however, when they become unreachable they may be garbage-collected. An implementation is allowed to postpone garbage collection or omit it altogether — it is a matter of implementation quality how garbage collection is implemented, as long as no objects are collected that are still reachable.

CPython implementation detail: CPython currently uses a reference-counting scheme with (optional) delayed detection of cyclically linked garbage, which collects most objects as soon as they become unreachable, but is not guaranteed to collect garbage containing circular references. See the documentation of the gc module for information on controlling the collection of cyclic garbage. Other implementations act differently and CPython may change. Do not depend on immediate finalization of objects when they become unreachable (ex: always close files).

关于python - python 总是同步调用 __del__ 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13690135/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com