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
是的,垃圾收集器负责跟踪引用计数。当引用计数降至零时,垃圾收集器将删除该对象。这是一个简单的例子。
\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还有一个关于 的注释del
。del
只是删除对象的引用计数。它不会删除对象。例如, if a = b = C()
,del a
仅删除名称 a 并删除 object 的引用计数C()
,但并没有真正删除它,因为b
仍然引用它。
你是对的,引用计数是一个 CPython 实现。就其他实现而言,Python 规范不提供有关对象何时被销毁的任何保证。
\n\n这就是Python语言参考关于此事的说法
\n\n\n\n对象永远不会被显式销毁;但是,当它们变得无法访问时,它们可能会被垃圾收集。允许实现推迟垃圾收集或完全省略它\xe2\x80\x94,只要没有收集仍然可达的对象,如何实现垃圾收集是实现质量的问题。
\n
归档时间: |
|
查看次数: |
1063 次 |
最近记录: |