这基本上是一个关于临时工寿命的问题。如果函数返回一个对象,但是引用并没有赋值给变量,只是用来调用返回对象的方法,临时引用会自动清除吗?
举一个具体的例子,假设有这个方法调用链:
o.method_a().method_b()
o.method_a()
调用完成时自动清除返回的临时引用method_b()
,就好像该行写成这样:
tmp = o.method_a()
try:
tmp.method_b()
finally:
tmp = None
编辑:我对一般答案感兴趣。一旦引用计数下降到 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();
C++ 标准规定“临时对象被销毁作为评估完整表达式的最后一步......(在词法上)包含创建它们的点。即使评估以抛出异常结束也是如此。” 在此示例中,这意味着std::shared_ptr<B>
调用创建的临时对象A::method_a()
会在 full-expression 的计算结束时立即销毁o.method_a()->method_b();
。销毁 astd::shared_ptr
意味着清除对共享对象的引用。