Python,结果与文档不一致:对象已删除但引用仍然很弱 'active'
Python, inconsistent results vs docs: object deleted but weak ref still 'active'
关于这个主题有很多问题我已经检查过。 Example dated 2014!
还可以找到 'canonical' 文档 here。
我不知道为什么我无法复制文档:
import weakref, gc
class A:
pass
a = A()
b = weakref.ref(a)
a
Out[5]: <__main__.A at 0x250f782f3a0>
b()
Out[6]: <__main__.A at 0x250f782f3a0>
del a
b()
Out[8]: <__main__.A at 0x250f782f3a0>
gc.collect()
Out[9]: 9
b()
Out[10]: <__main__.A at 0x250f782f3a0>
b
应该返回 None
但不是。
编辑
有趣的是,this question 我也很感兴趣,但几年后仍未得到答复。只是标记以防有人可以同时解决这两个问题。
(Windows 10, python 3.8, 康达环境)
我尝试了问题评论中提到的内容,并出于文档目的发布了一个答案。 运行 REPL 中的上述代码是问题所在。
我尝试了什么:
test.py:
if __name__ == '__main__':
import weakref, gc
class A: pass
a = A()
b = weakref.ref(a)
print("a: ", a)
print("b(): ", b())
del a
print("b(): ", b())
gc.collect()
print("b(): ", b())
$ python test.py
:
a: <__main__.A object at 0x000002678F96A400>
b(): <__main__.A object at 0x000002678F96A400>
b(): None
b(): None
Process finished with exit code 0
所以它确实像记录的那样工作。
关于这个主题有很多问题我已经检查过。 Example dated 2014!
还可以找到 'canonical' 文档 here。
我不知道为什么我无法复制文档:
import weakref, gc
class A:
pass
a = A()
b = weakref.ref(a)
a
Out[5]: <__main__.A at 0x250f782f3a0>
b()
Out[6]: <__main__.A at 0x250f782f3a0>
del a
b()
Out[8]: <__main__.A at 0x250f782f3a0>
gc.collect()
Out[9]: 9
b()
Out[10]: <__main__.A at 0x250f782f3a0>
b
应该返回 None
但不是。
编辑
有趣的是,this question 我也很感兴趣,但几年后仍未得到答复。只是标记以防有人可以同时解决这两个问题。
(Windows 10, python 3.8, 康达环境)
我尝试了问题评论中提到的内容,并出于文档目的发布了一个答案。 运行 REPL 中的上述代码是问题所在。
我尝试了什么:
test.py:
if __name__ == '__main__':
import weakref, gc
class A: pass
a = A()
b = weakref.ref(a)
print("a: ", a)
print("b(): ", b())
del a
print("b(): ", b())
gc.collect()
print("b(): ", b())
$ python test.py
:
a: <__main__.A object at 0x000002678F96A400>
b(): <__main__.A object at 0x000002678F96A400>
b(): None
b(): None
Process finished with exit code 0
所以它确实像记录的那样工作。