微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决为什么在Python退出时sys.argv设置为None?

请考虑以下脚本:

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()

我希望通过运行此代码将在类sys.argv的{​​{1}}和__init__()中打印相同的__del__()。但是,输出不同于预期:

A

我的问题:为什么会这样? cpython是在关机时将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,...) 设置为sys.argv的实现细节吗?还是在文档中的某个地方进行了描述?为何Python(显式或通过GC)首先从None删除某些对象(如sysargv),而保留其他对象(如Meta_path)呢?

我正在GNU / Linux上使用cpython 3.8.5。

解决方法

在解释器关闭期间发生的__del__期间,所有关于解释器状态的保证都会或多或少地消失。

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

(无论如何,您都不应该依赖__del__进行确定性清理;例如,用户可能已经gc.disable() d被使用,并且您的函数将永远不会被调用。而是使用上下文管理器。)>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。