これは基本的に、臨時職員の寿命に関する質問です。関数がオブジェクトを返すが、参照が変数に割り当てられておらず、返されたオブジェクトのメソッドを呼び出すためにのみ使用される場合、一時参照は自動的にクリアされますか?
具体的な例を挙げると、次の一連のメソッド呼び出しがあるとします。
o.method_a().method_b()
行が次のように記述されているかのように、への呼び出しが終了o.method_a()
すると自動的にクリアされるによって返される一時的な参照です。method_b()
tmp = o.method_a()
try:
tmp.method_b()
finally:
tmp = None
編集:一般的な回答に興味があります。CPython は、参照カウントが 0 になるとすぐにオブジェクトをファイナライズします。他の 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();
。a の破棄とstd::shared_ptr
は、共有オブジェクトへの参照をクリアすることを意味します。