Как удалить объект, назначенный переменной? - PullRequest
0 голосов
/ 12 ноября 2018

У меня есть следующий код:

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

node1 = Node(12)
cur = node1

Можно ли удалить node1, используя cur?

Я пытался del cur, но это не дает желаемого результата cur теперь больше не существует, но node1 все еще существует.

Любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

в дополнение к ответу DeepSpace, нет способа удалить node1, за исключением того, что вы найдете все переменные, которые ссылаются на этот экземпляр, а затем удалите его, я придумал функцию, которую нужно использовать вместо del для вашей цели :

import sys

def kill(name):
    l = []
    for k, v in sys.modules[__name__].__dict__.items():
        if str(v) == str(name):  # Finding all vars that refers to that instace
            l.append(k)

    for i in l:  # Deleting them
        del sys.modules[__name__].__dict__[i]

итак, если у вас есть этот класс

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

node1 = Node(12)
cur = node1

если вы наберете:

kill(cur)

node1 и все остальные, ссылающиеся на этот экземпляр, будут удалены.

Тестирование:

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)
<ipython-input-119-3c1cfaee77de> in <module>()
----> 1 cur

NameError: name 'cur' is not defined

In [120]: node1
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-120-d9e9a8ca6efc> in <module>()
----> 1 node1

NameError: name 'node1' is not defined
0 голосов
/ 12 ноября 2018

Давайте разберемся в заблуждении: объекты не «назначены» в Python.

Переменные - это просто ссылка на место в памяти, в котором содержатся значения.

Делая del cur, вы только убедитесь, что cur не ссылается на область памяти, к которой также относится node1, но с node1 ничего не произойдет.

Проверьте это визуализация . Обратите внимание, как стрелки node1 и cur указывают на одно и то же Node расположение объекта в памяти. Если вы нажмете «Вперед», то увидите, что при выполнении del cur происходит только то, что стрелка cur будет удалена (т. Е. cur больше не будет ссылаться на то же место в памяти, что и node1 ссылки).

Нет способа сделать то же самое для node1 без выполнения del node1, и даже в этом случае сборщик мусора должен решить, когда удалять сам объект Node (который фактически освобождает память занимает). Это зависит от конкретной реализации интерпретатора Python, но обычно это делается с помощью подсчета ссылок.

См. Эти 2 внешних ресурса для полезной информации:

Сборщик мусора Python и Факты и мифы об именах и значениях Python

...