2010-06-10 30 views
7

supose usted tiene algo así como:¿Cómo eliminar todas las referencias de un objeto en Python?

x = "something" 
b = x 
l = [b] 

¿Cómo se puede eliminar el objeto sólo tener una referencia, digamos x?

del x no hará el truco; el objeto todavía es alcanzable desde b, por ejemplo.

+3

¿De dónde es este 'a' de lo que estás hablando? –

+0

¿Querías decir 'x'? –

+3

¿por qué le gustaría hacer esto? – SilentGhost

Respuesta

5

No es así. Ese es todo el punto. Imagine si l se encuentra en una biblioteca fuera de su control. Tiene todo el derecho a esperar que los elementos de la colección no desaparezcan.

Además, imagine si fuera de otra manera. Tendría preguntas aquí en SO "¿Cómo evito que otros eliminen mis objetos?". Como diseñador de idiomas, no puede satisfacer ambas demandas.

+0

No desapareceré toda la lista, solo un elemento. –

+0

Detalle, no importa. La biblioteca contiene una referencia al objeto; según las reglas de lenguaje de Python, puede confiar en esa referencia manteniendo vivo el objeto. – MSalters

11

No no no. Python tiene un recolector de basura que tiene problemas de territorio muy fuertes: no te meterá en la creación de objetos, no te meterás con la eliminación de objetos.

En pocas palabras, no se puede hacer, y por una buena razón.

Si, por ejemplo, su necesidad proviene de casos de, por ejemplo, algoritmos de almacenamiento en caché que conservan referencias, pero no debe impedir que se recopile basura una vez que nadie la está utilizando, le recomendamos echar un vistazo a weakref.

+0

el objetivo es asegurar que el objeto no se use nuevamente. –

+1

@Juanjo luego haga esto de la manera programática adecuada. Sus objetos deberían permitirle 'cerrar' el sujeto, o lo que sea que esté tratando de hacer. No hay magia involucrada. Al igual que un archivo debe cerrarse una vez, no importa cuántas funciones lean/escriban – abyx

+1

@Juanjo: Eliminar un elemento no garantiza que no se vuelva a utilizar. De hecho, si se usa de nuevo, su programa se bloqueará. Escriba su código sabiamente y no use objetos que no quiera usar. –

7

La única solución que veo ahora es que usted debe asegurarse de que que está sosteniendo la única referencia a x, todo el mundo debe no llegar x sí mismo, sino una referencia débil que apunta a x. referencias débiles son implementados en el módulo weakref y se puede utilizar de esta manera:

>>> import weakref 
>>> class TestClass(object): 
...  def bark(self): 
...   print "woof!" 
...  def __del__(self): 
...   print "destructor called" 
... 
>>> x = TestClass() 
>>> b = weakref.proxy(x) 
>>> b 
<weakproxy at 0x7fa44dbddd08; to TestClass at 0x7fa44f9093d0> 
>>> b.bark() 
woof! 
>>> del x 
destructor called 
>>> b.bark() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ReferenceError: weakly-referenced object no longer exists 

Sin embargo, tenga en cuenta que no todas las clases pueden ser débil se hace referencia. En particular, la mayoría de los tipos incorporados no pueden. Algunos tipos incorporados pueden tener una referencia débil si los subclase (como dict), pero otros no (como int).

+0

¿Qué hay de str? –

+1

'str' no se puede hacer referencia débil, ni siquiera si lo subclase. Las cadenas de referencia débil abrirían una enorme lata de gusanos; por ejemplo, el intérprete de Python puede elegir "internar" un objeto de cadena y mantenerlo en la memoria incluso si no hay referencias a él con la esperanza de que pueda ser útil más adelante.Por lo general, el intérprete lo hace con cadenas pequeñas y enteros, pero también puede optar por internar una cadena con la instrucción interna 'intern' (al menos en Python 2.x). –

Cuestiones relacionadas