2012-07-27 11 views
7

en c/C++, tiene variables en la pila cuando crea una variable local dentro de una función. existenpython crea todo desde el montón?

http://effbot.org/zone/call-by-object.htm

objetos CLU independientemente de activaciones de procedimiento. El espacio para objetos se asigna desde un área de almacenamiento dinámico /.../ En la teoría , todos los objetos continúan existiendo para siempre. En la práctica, el espacio utilizado por un objeto puede recuperarse cuando el objeto no es más accesible para cualquier programa de CLU.

¿Esto significa que los objetos en python se crean a partir de heap (como en malloc en c/C++)? y los objetos se desasignan cuando no hay ningún nombre asociado a ellos (como punteros inteligentes)?

Ejemplo:

def foo(a): 
    result = [] 
    result.append(a) 
    return result 

foo("hello") 

myList = foo("bye") 

Así que el primer resultado ([]) fue creado en el montón y consiguió desasignado porque no hay nombre asociado con ella?

+0

También puede eliminar cosas manualmente usando 'del' como en' del result' si cree que es necesario. –

+0

Si su motivación para hacer esto es que desea que su función siempre use la misma lista, tenga en cuenta que puede definirla como 'def foo (a, result = [])', y se usará la misma lista cada vez que llamar a la función, ya que se crea cuando se define la función, no cuando se ejecuta. – geoffspear

Respuesta

12

Sí, todos los objetos de Python viven en el montón (al menos en CPython). Se contabilizan como referencias: se desasignan cuando desaparece la última referencia al objeto. (CPython también tiene un recolector de basura para romper ciclos.)

En CPython, su primera lista desaparece tan pronto como la función retorna ya que no enlazó el valor devuelto a un nombre y el recuento de referencia cayó a cero. En otra implementación, el objeto puede vivir más tiempo hasta que el recolector de basura entra en acción.

Algunos objetos (como archivos abiertos) tienen recursos adjuntos que se liberan automáticamente cuando se desasigna el objeto, pero debido a lo anterior no se recomienda confía en esto Los recursos deben cerrarse explícitamente cuando haya terminado con ellos.

5

Sí, todos los valores en CPython se asignan en el montón y se cuentan como referencia para saber cuándo asignarlos. A diferencia de C, no hay manera de saber en la mayoría de los casos si un valor sobrevivirá a su función, por lo que lo único seguro es asignarlo todo.

Sin duda podría hacer algunos análisis y determinar que ciertos valores nunca se pasan a las funciones y por lo tanto no podrían escapar, pero eso es de uso limitado en Python y la sobrecarga adicional probablemente no valdría la pena.

4

Como complemento a las otras respuestas, aquí es una manera de seguir cuando recolección de basura pasa, mediante el método especial __del__:

class Test(object): 
    def __init__(self, name): 
     self.name = name 

    def __del__(self): 
     print "deleting {0}".format(self.name) 

print "discarded instance creation" 
Test("hello") 

print "saved instance creation" 
myList = Test("bye") 

print "program done" 

Salida:

 
discarded instance creation 
deleting hello 
saved instance creation 
program done 
deleting bye 

Para obtener más en profundidad datos, vea el gc module.

Cuestiones relacionadas