Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中对已删除对象的引用_Python_Reference - Fatal编程技术网

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
被销毁时调用的一个方法。