Esto es básicamente una pregunta sobre la vida útil de los temporales. Si una función devuelve un objeto, pero la referencia no está asignada a una variable y solo se usa para llamar a un método en el objeto devuelto, ¿se borra automáticamente la referencia temporal?¿Las referencias temporales se borran automáticamente en Python?
Para dar un ejemplo concreto, supongamos que existe esta cadena de llamadas a métodos:
o.method_a().method_b()
es la referencia temporal devuelto por o.method_a()
automáticamente borra cuando la llamada a method_b()
acabados, como si la línea se escribe así:
tmp = o.method_a()
try:
tmp.method_b()
finally:
tmp = None
EDIT: Tengo interés en una respuesta general. CPython finaliza los objetos tan pronto como el recuento de referencia se reduce a 0. Es posible que otras implementaciones de Python no finalicen los objetos inmediatamente. Me pregunto si el lenguaje Python es como C++, lo que garantiza que los objetos temporales se destruyan al final de la declaración para la que fueron creados. (Excepto que en Python, la cuestión es si las referencias temporales se borran al final de la instrucción para el que fueron creados.)
En C++, código similar podría implementarse con:
class B {
public:
void method_b();
};
class A {
public:
std::shared_ptr<B> method_a();
};
A o;
o.method_a()->method_b();
El C++ estados estándar "Los objetos temporales se destruyen como el último paso en la evaluación de la expresión completa ... que (léxicamente) contiene el punto donde se crearon. Esto es cierto incluso si esa evaluación termina arrojando una excepción". En este ejemplo, significa que el objeto temporal std::shared_ptr<B>
creado por la llamada a A::method_a()
se destruye inmediatamente al final de la evaluación de la expresión completa o.method_a()->method_b();
. Destruir un std::shared_ptr
significa borrar una referencia al objeto compartido.
Sus dos fragmentos tienen semántica idéntica, pero no es una dado que cualquiera de ellos llamará a finalizadores o destruirá objetos inmediatamente. De hecho, incluso en CPython la destrucción puede retrasarse si el objeto está en un ciclo (aunque entonces no se puede tener un finalizador). – fijal