python中对已删除对象的引用
首先,当python中对已删除对象的引用,python,reference,Python,Reference,首先,当gc隐式或显式调用对象的\uuu del\uuu函数时,我知道该对象是析构函数(或销毁)。好的,为什么我可以在这个对象被销毁后通过它的引用获取对象的成员变量 python版本是3.7.1 O类(): 定义初始化(自): self.name='我是O' 定义(自我): 打印('Oops,O已删除') 如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu': o=o() c=o 打印(id(o)) o、 _uuudel_uuuu() 打印(c.名称) 打印(id
gc
隐式或显式调用对象的\uuu del\uuu
函数时,我知道该对象是析构函数(或销毁)。好的,为什么我可以在这个对象被销毁后通过它的引用获取对象的成员变量
python版本是3.7.1
O类():
定义初始化(自):
self.name='我是O'
定义(自我):
打印('Oops,O已删除')
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
o=o()
c=o
打印(id(o))
o、 _uuudel_uuuu()
打印(c.名称)
打印(id(c))
结果
2473601495560
Oops, O is deleted
I am a O
2473601495560
Oops, O is deleted
我们可以发现问题存在,并且destruct函数被调用了2次,但是为什么呢。感谢您的帮助首先是一些基本事实
- CPython使用引用计数。当对象的引用计数降至0时,将取消分配对象
- 并非所有对象都由
模块处理。从文件中: 一般来说,不跟踪原子类型的实例,而跟踪非原子类型的实例(容器、用户定义的对象…)gc
- Python“变量”实际上是引用对象的名称
c=o
时,您将创建对o
引用的同一类o
实例的第二个引用。这就是为什么它们具有相同的id
根据定义,当对象被取消分配时,不再有对它的引用。所以你再也找不到它的参考了
编辑:
你对\uu del\uu
的印象似乎有点颠倒了。Python通常会在引用计数达到0后调用它,请参阅。
但是,如果您的程序调用对象的\uu del\uu
方法,则不会神奇地删除所有引用!有关更详细的说明,请参阅(以及前面提到的文档)
双下划线方法(或“dunder”方法)供Python内部使用,以提供一些功能。您通常不应从程序中调用它们。请参阅o.uu del_u
不会删除o
,它只是在o
被销毁时调用的一个方法。