3 votes

Comment supprimer l'objet assigné à une variable ?

J'ai le code suivant :

class Node:
  def __init__(self, item):
    self.item = item  

node1 = Node(12)
cur = node1

Est-il possible de supprimer node1 en utilisant cur ?

J'ai essayé del cur mais cela ne donne pas le résultat souhaité, cur n'existe plus mais node1 existe toujours.

Toute aide est appréciée.

5voto

DeepSpace Points 31729

Clarifions une idée fausse : les objets ne sont pas "assignés" en Python.

Les variables ne sont que des références à un emplacement en mémoire qui contient des valeurs.

En faisant del cur, tu vérifies simplement que cur ne référence plus l'emplacement mémoire auquel node1 fait référence, mais rien ne se passera à node1.

Jette un œil à cette visualisation. Remarque comment les flèches de node1 et cur pointent vers le même emplacement en mémoire de l'objet Node. Si tu cliques sur "Forward", tu verras que lorsque del cur est exécuté, la seule chose qui se passe est que la flèche de cur sera supprimée (c'est-à-dire que cur ne référencera plus le même emplacement en mémoire que node1).

Il n'y a pas de moyen de faire la même chose pour node1 sans faire del node1, et même alors c'est au ramasse-miettes de décider quand supprimer l'objet Node lui-même (ce qui libérera effectivement la mémoire qu'il utilise). Cela dépend de l'implémentation spécifique de l'interpréteur Python, mais c'est généralement fait avec le comptage des références.

Consulte ces 2 ressources externes pour des informations utiles :

Le ramasse-miettes de Python et Faits et mythes sur les noms et les valeurs Python

2voto

mehrdad-pedramfar Points 4667

En plus de la réponse de DeepSpace, il n'y a aucun moyen de supprimer node1 sauf si vous trouvez toutes les variables qui se réfèrent à cette instance, puis les supprimez, j'ai créé une fonction à utiliser à la place de del pour votre objectif :

import sys

def kill(name):
    l = []
    for k, v in sys.modules[__name__].__dict__.items():
        if str(v) == str(name):  # Trouver toutes les variables qui se réfèrent à cette instace
            l.append(k)

    for i in l:  # Les supprimer
        del sys.modules[__name__].__dict__[i]

donc, si vous avez cette classe

class Node:
    def __init__(self, item):
        self.item = item  

node1 = Node(12)
cur = node1

si vous tapez :

kill(cur)

node1 et tous les autres qui se réfèrent à cette instance seront supprimés.

test :

In [116]: node1
Out[116]: <__main__.Node at 0x7f68eca386d8>

In [117]: cur
Out[117]: <__main__.Node at 0x7f68eca386d8>

In [118]: kill(cur)

In [119]: cur
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
 in ()
----> 1 cur

NameError: name 'cur' is not defined

In [120]: node1
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
 in ()
----> 1 node1

NameError: name 'node1' is not defined

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X