是否在Python中自动清除临时引用?

Dan*_*ien 5 python reference language-details temporary-objects

这基本上是关于临时生命的问题.如果函数返回一个对象,但该引用未分配给变量并且仅用于调用返回对象上的方法,则临时引用是否会自动清除?

举一个具体的例子,假设有一系列方法调用:

o.method_a().method_b()
Run Code Online (Sandbox Code Playgroud)

o.method_a()当调用method_b()完成时,自动清除返回的临时引用,就好像该行写成:

tmp = o.method_a()
try:
    tmp.method_b()
finally:
    tmp = None
Run Code Online (Sandbox Code Playgroud)

编辑:我对一般答案感兴趣.一旦引用计数降至0,CPython就会终止对象.其他Python实现可能不会立即终止对象.我想知道Python语言是否像C++一样,它保证临时对象在创建它们的语句的末尾被销毁.(除了在Python中,问题是临时引用是否在创建它们的语句的末尾被清除.)

在C++中,类似的代码可能用以下方法实现:

class B {
public:
    void method_b();
};

class A {
public:
    std::shared_ptr<B> method_a();
};



A o;
o.method_a()->method_b();
Run Code Online (Sandbox Code Playgroud)

C++标准规定"临时对象被破坏作为评估全表达式的最后一步......(词法上)包含创建它们的点.即使该评估以抛出异常结束,也是如此." 在此示例中,这意味着在完全表达式的求值结束时,将立即销毁std::shared_ptr<B>由调用创建的临时对象.销毁a 意味着清除对共享对象的引用.A::method_a()o.method_a()->method_b();std::shared_ptr

Pra*_*ota 3

是的,垃圾收集器负责跟踪引用计数。当引用计数降至零时,垃圾收集器将删除该对象。这是一个简单的例子。

\n\n
>>> class C(object):\n...     def foo(self):\n...          return B()\n... \n>>> class B(object):\n...     def __del__(self):\n...         print \'deleting %r\' %self\n...     def bar(self):\n...         print \'I am method bar of %r\' %self\n... \n>>> c = C()\n>>> c.foo().bar()\nI am method bar of <__main__.B object at 0xa187d2c>\ndeleting <__main__.B object at 0xa187d2c>\n
Run Code Online (Sandbox Code Playgroud)\n\n

作为旁注,如果有任何其他对象对临时对象的引用,则它不会被删除。仅当引用计数为零时,对象才会被垃圾回收。

\n\n

还有一个关于 的注释deldel只是删除对象的引用计数。它不会删除对象。例如, if a = b = C()del a仅删除名称 a 并删除 object 的引用计数C(),但并没有真正删除它,因为b仍然引用它。

\n\n

你是对的,引用计数是一个 CPython 实现。就其他实现而言,Python 规范不提供有关对象何时被销毁的任何保证。

\n\n

这就是Python语言参考关于此事的说法

\n\n
\n

对象永远不会被显式销毁;但是,当它们变得无法访问时,它们可能会被垃圾收集。允许实现推迟垃圾收集或完全省略它\xe2\x80\x94,只要没有收集仍然可达的对象,如何实现垃圾收集是实现质量的问题。

\n
\n