为什么 sys.argv 在 Python 退出时设置为 None?

m4t*_*4tx 1 python cpython internals

请考虑以下脚本:

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()
Run Code Online (Sandbox Code Playgroud)

我期望从运行这个代码将打印相同sys.argv__init__()__del__()阶级的A。但是,输出与预期不同:

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, ...)
Run Code Online (Sandbox Code Playgroud)

我的问题:为什么会这样?它是一个实现细节CPython的设置sys.argv,以None在关机,或者是它的文档中描述的地方?为什么 Python(显式地或通过 GC)首先从sys(likeargvmeta_path) 中删除一些对象,同时保留其他对象 (like float_info)?

我在 GNU/Linux 上使用 CPython 3.8.5。

AKX*_*AKX 5

__del__解释器关闭期间发生的s 期间,解释器状态的所有保证或多或少都关闭。

我有根据的猜测是模块和对象以任意顺序被清理。如果您想深入研究,Py_FinalizeEx(void)这里似乎是调用所有其他函数的相关函数。

__del__无论如何你不应该依赖确定性清理;例如,用户可能有gc.disable()d 并且你的函数永远不会被调用。相反,使用上下文管理器。)