如何删除分配给变量的对象?
How to delete object assigned to variable?
我有以下代码:
class Node:
def __init__(self, item):
self.item = item
node1 = Node(12)
cur = node1
是否可以使用 cur
删除 node1
?
我试过 del cur
但它没有给出预期的结果 cur
现在不再存在但 node1
仍然存在。
感谢任何帮助。
让我们澄清一个误解:对象不在 Python 中 "assigned"。
变量只是对内存中恰好包含值的位置的引用。
通过执行 del cur
,您只是确保 cur
不引用 node1
也引用的内存位置,但 node1
不会发生任何事情。
看看这个 visualization。请注意 node1
和 cur
的箭头如何指向同一个 Node
对象在内存中的位置。如果你点击 "Forward" 你会看到当 del cur
被执行时唯一发生的事情是 cur
的箭头将被移除(即 cur
将不再引用node1
引用的内存中的相同位置)。
如果不执行 del node1
,就无法对 node1
执行相同的操作,即便如此,也由垃圾收集器决定何时删除 Node
对象本身(这实际上会释放它占用的内存)。这取决于 Python 解释器的具体实现,但这通常是通过引用计数来完成的。
查看这 2 个站外资源以获取有用信息:
Python's garbage collector and Facts and myths about Python names and values
除了 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
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
我有以下代码:
class Node:
def __init__(self, item):
self.item = item
node1 = Node(12)
cur = node1
是否可以使用 cur
删除 node1
?
我试过 del cur
但它没有给出预期的结果 cur
现在不再存在但 node1
仍然存在。
感谢任何帮助。
让我们澄清一个误解:对象不在 Python 中 "assigned"。
变量只是对内存中恰好包含值的位置的引用。
通过执行 del cur
,您只是确保 cur
不引用 node1
也引用的内存位置,但 node1
不会发生任何事情。
看看这个 visualization。请注意 node1
和 cur
的箭头如何指向同一个 Node
对象在内存中的位置。如果你点击 "Forward" 你会看到当 del cur
被执行时唯一发生的事情是 cur
的箭头将被移除(即 cur
将不再引用node1
引用的内存中的相同位置)。
如果不执行 del node1
,就无法对 node1
执行相同的操作,即便如此,也由垃圾收集器决定何时删除 Node
对象本身(这实际上会释放它占用的内存)。这取决于 Python 解释器的具体实现,但这通常是通过引用计数来完成的。
查看这 2 个站外资源以获取有用信息:
Python's garbage collector and Facts and myths about Python names and values
除了 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
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