2010-06-10 3 views

Répondre

5

Ce n'est pas le cas. C'est tout le point. Imaginez si l se trouve dans une bibliothèque hors de votre contrôle. Il a tous les droits de s'attendre à ce que les éléments de la collection ne disparaissent pas.

Aussi, imaginez s'il en était autrement. Vous auriez des questions ici sur SO "Comment empêcher les autres de supprimer mes objets?". En tant que concepteur de langage, vous ne pouvez pas satisfaire les deux exigences.

+0

Je ne dissapear toute la liste, un seul élément. –

+0

Détail, n'a pas d'importance. La bibliothèque contient une référence à l'objet; Selon les règles du langage Python, il peut s'appuyer sur cette référence pour maintenir l'objet en vie. – MSalters

11

Non non non. Python a un garbage collector qui a de très forts problèmes de territoire - il ne va pas vous embêter à créer des objets, vous ne vous en occupez pas en supprimant des objets.

En termes simples, cela ne peut être fait, et pour une bonne raison. Si, par exemple, votre besoin provient de cas, par exemple, d'algorithmes de mise en cache qui gardent des références, mais ne devrait pas empêcher les données d'être collectées lorsque personne ne les utilise, vous pouvez jeter un oeil à weakref.

+0

le porpuse est de s'assurer que l'objet ne sera pas utilisé à nouveau. –

+1

@Juanjo alors faites-le de la manière programmatique appropriée. Vos objets devraient vous permettre de «fermer» le sujet, ou quoi que ce soit que vous essayez de faire. Il n'y a pas de magie impliquée. Tout comme un fichier doit être fermé une fois, peu importe le nombre de fonctions lues/écrites – abyx

+1

@Juanjo: La suppression d'un élément ne garantit pas qu'il ne sera plus utilisé. En fait, s'il est à nouveau utilisé, votre programme va planter. Écrivez votre code à bon escient et n'utilisez pas d'objets que vous ne voulez pas utiliser. –

7

La seule solution que je vois en ce moment est que vous devez vous assurer que vous tenez la seule référence à x, tout le monde doit pas obtenir lui-même x mais une référence faible pointant vers x. références faibles sont mises en œuvre dans le module weakref et vous pouvez l'utiliser de cette façon:

>>> 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 

Toutefois, notez que toutes les classes peuvent être faibles référencés. En particulier, la plupart des types intégrés ne le peuvent pas. Certains types intégrés peuvent être faibles référencés si vous les sous-classez (comme dict), mais d'autres ne peuvent pas (comme int).

+0

Qu'en est-il de str? –

+1

'str' ne peut pas être référencé faible, même si vous le sous-classez. Des cordes de référencement faibles ouvriraient une énorme boîte de vers; par exemple, l'interpréteur Python peut choisir d '"internaliser" un objet chaîne et de le garder en mémoire même s'il n'y a pas de références dans l'espoir qu'il pourrait être utile plus tard.Habituellement, l'interpréteur le fait avec de petites chaînes et entiers, mais vous pouvez également choisir d'intérier une chaîne avec le 'built' builtin (au moins dans Python 2.x). –

Questions connexes