本帖最后由 阿奇_o 于 2022-11-2 21:36 编辑
哈哈,因为 del x 的本质就不是 "删除对象", 而是"解除绑定"。
怎么理解这个解除绑定呢? —— 举个有点残酷的例子吧:
假设你对象(女朋友)和你分手了,这就是"解除绑定",但 分手之前 或许她就已经和别的小白脸勾搭上了,甚至是多个勾搭上了。。
也就是 del you 解除了你的绑定后,她还存在若干个 "绑定/引用关系",即reference>0,根据垃圾回收机制,它还没被回收,还没销毁。。
或者从代码上,更直观地说,del bf 是从命名空间(globals()或locals()字典)里 将该 bf字符名移除(变回未加定义的),
当你 再使用时,就会报错,因为绑定关系已经不存在,"bf"的名字也就无法在命名空间里找到。 比如:f1, f2 = F(), F()
ls = [f1, f2]
sys.getrefcount(ls) # ls这名字所绑定的对象的引用总数。 注:本来应该是1个,但getrefcount函数执行时,形参与实参会有一个临时的局部绑定,所以"通常总会多一个"(见官方说明)
2
sys.getrefcount(f1) # f1所绑定的对象的引用总数(数一数:f1-->F_obj_1, ls[0]-->F_obj_1, getrefcount的形参object-->F_obj_1, 一共3个绑定/引用关系)
3
globals()
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, 'sys': <module 'sys' (built-in)>, 'F': <class '__main__.F'>, 'f1': <__main__.F object at 0x00000166761427A0>, 'f2': <__main__.F object at 0x00000166761427D0>, 'ls': [<__main__.F object at 0x00000166761427A0>, <__main__.F object at 0x00000166761427D0>]}
del f1
globals() # 已经看不见 f1 了(解除f1的绑定),但 ls[0]位置上还是指向、绑定着 原本f1所绑定的对象
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, 'sys': <module 'sys' (built-in)>, 'F': <class '__main__.F'>, 'f2': <__main__.F object at 0x00000166761427D0>, 'ls': [<__main__.F object at 0x00000166761427A0>, <__main__.F object at 0x00000166761427D0>]}
f1
Traceback (most recent call last):
File "<pyshell#12>", line 1, in <module>
f1
NameError: name 'f1' is not defined. Did you mean: 'f2'? # 看,f1 这位男友,已经被对象给"甩了"。。
# ps: 那要怎么 摧毁这个可恶的 女人(对象)呢? —— 搞坏、破坏掉她和其他所有男人的关系!把她丢到"垃圾回收"里去! 哈哈
del ls[0]
|