【发布时间】:2020-08-12 13:50:58
【问题描述】:
请考虑以下脚本:
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__() 类 A 中打印相同的 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。
【问题讨论】:
-
请注意,MacOS 上的一个 CPython Python 3.7.4
sys.float_info也设置为None。