Это в основном вопрос о времени жизни временных библиотек. Если функция возвращает объект, но ссылка не назначается переменной и используется только для вызова метода для возвращаемого объекта, временная ссылка автоматически очищается?
Чтобы дать конкретный пример, предположим, что существует эта цепочка вызовов методов:
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
означает очистку ссылки на общий объект.