Jest to w zasadzie pytanie o żywotność tymczasowych. Jeśli funkcja zwraca obiekt, ale odwołanie nie jest przypisane do zmiennej i jest używane tylko do wywołania metody na zwróconym obiekcie, czy tymczasowe odwołanie jest automatycznie czyszczone?Czy odwołania tymczasowe są automatycznie usuwane w Pythonie?
Aby podać konkretny przykład, załóżmy, że jest to łańcuch wywołań metod:
o.method_a().method_b()
Czy tymczasowe odniesienie zwrócony przez o.method_a()
automatycznie kasowane, gdy wezwanie do method_b()
wykończeń, jakby linia zostały napisane tak:
tmp = o.method_a()
try:
tmp.method_b()
finally:
tmp = None
EDIT: Jestem zainteresowany ogólną odpowiedź. CPython finalizuje obiekty, gdy liczba odwołań spadnie do 0. Inne implementacje Pythona mogą nie sfinalizować obiektów natychmiast. Zastanawiam się, czy język Python jest podobny do C++, który gwarantuje, że tymczasowe obiekty są niszczone na końcu instrukcji, dla której zostały utworzone. (Z wyjątkiem, że w Pythonie, pytanie brzmi, czy referencje tymczasowe są usuwane na końcu zestawienia, dla których zostały utworzone.)
W C++ podobny kod może być realizowane z:
class B {
public:
void method_b();
};
class A {
public:
std::shared_ptr<B> method_a();
};
A o;
o.method_a()->method_b();
C++ standardowe stany "Tymczasowe obiekty są niszczone jako ostatni krok w ocenie pełnego wyrażenia ... to (leksykalnie) zawiera punkt, w którym zostały stworzone.To jest prawdą, nawet jeśli ta ocena kończy się wyrzuceniem wyjątku." W tym przykładzie oznacza to, że tymczasowy obiekt std::shared_ptr<B>
utworzony przez wywołanie A::method_a()
jest niszczony natychmiast po zakończeniu oceny pełnego wyrażenia o.method_a()->method_b();
. Niszczenie obiektu std::shared_ptr
oznacza wyczyszczenie odniesienia do współużytkowanego obiektu.
Twoje dwa fragmenty mają identyczne semantykę, ale to nie jest biorąc pod uwagę, że któryś z nich wywoła finalizatory lub natychmiast niszczy obiekty. W rzeczywistości nawet w CPython zniszczenie może być opóźnione, jeśli obiekt jest w cyklu (chociaż nie możesz wtedy mieć finalizatora). – fijal