请考虑以下脚本:
import sys
class A:
def __init__(self):
print('Constructing A')
print(sys.argv)
print(sys.meta_path)
print(sys.float_info)
def __del__(self):
print('Destructing A')
print(sys.argv)
print(sys.meta_path)
print(sys.float_info)
x = A()
运行这段代码所期望的是在类__init__()
和__del__()
中打印相同的sys.argv
。但是,输出与预期不同:
Constructing A
['test.py']
[<class '_frozen_importlib.BuiltinImporter'>, ...]
sys.float_info(max=1.7976931348623157e+308, ...)
Destructing A
None
None
sys.float_info(max=1.7976931348623157e+308, ...)
我的问题:为什么会这样?CPython在关机时将sys.argv
设置为None
是一个实现细节,还是在文档中的某个地方进行了描述?为什么Python(显式地或通过GC)首先从sys
(如argv
或meta_path
)删除一些对象,而保留其他对象(如float_info
)
我正在GNU/Linux上使用CPython 3.8.5
在解释器关闭期间发生的
__del__
期间,解释器状态的所有保证或多或少都处于关闭状态我有根据地猜测,模块和对象正在以任意顺序被清理。如果您想深入研究,^{} here 似乎是调用所有其余函数的相关函数
(无论如何,您不应该依赖
__del__
进行确定性清理;例如,用户可能有gc.disable()
d,并且您的函数永远不会被调用。相反,请使用上下文管理器。)相关问题 更多 >
编程相关推荐