(我已经在你的另一个问题中回答了这个问题,所以我也将在这里使用它,稍作修改:)
del
不删除对象;事实上,在 Python 中,甚至不可能告诉解释器/VM 从内存中删除对象,因为 Python 是一种垃圾收集语言(如 Java、C#、Ruby、Haskell 等)。
相反,del
当调用一个变量(而不是字典键或列表项)时会发生什么,如下所示:
del a
是它只删除了局部(或全局)变量,而不是它指向的变量(Python 中的每个变量都持有指向其内容的指针/引用,而不是内容本身)。事实上,由于局部变量和全局变量在底层存储为字典(请参阅locals()
和globals()
),del a
相当于:
del locals()['a']
(或del globals()['a']
应用于全局时。)
所以如果你有:
a = []
b = a
您正在制作一个列表,将对其的引用存储在其中a
,然后将该引用复制到其中,b
而无需复制/触摸列表对象本身。因此,这两个调用影响同一个对象:
>>> a.append(1)
>>> b.append(2)
>>> a
[1, 2]
>>> b
[1, 2]
>>> a is b # would be False for 2 identical but different list objects
True
>>> id(a) == id(b)
True
(id
返回对象的内存地址)
而删除与触摸指向的b
内容无关:b
>>> a = []
>>> b = a
>>> del b # a is still untouched and points to a list
>>> b
NameError: name 'b' is not defined
>>> a
[]