Автоматически очищаются ли временные ссылки в Python?

Это в основном вопрос о времени жизни временных библиотек. Если функция возвращает объект, но ссылка не назначается переменной и используется только для вызова метода для возвращаемого объекта, временная ссылка автоматически очищается?

Чтобы дать конкретный пример, предположим, что существует эта цепочка вызовов методов:

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 , созданный вызовом A :: method_a () , немедленно уничтожается в конце оценки полное выражение o.method_a () -> method_b (); . Уничтожение std :: shared_ptr означает очистку ссылки на общий объект.

5
задан Daniel Trebbien 28 January 2012 в 16:36
поделиться