首页 > 解决方案 > python - 为什么不能在全局名称中使用双下划线__?

问题描述

请告知症状的原因以及要查看哪些 Python 资源以进一步了解。

Python 3.8.8包含在__变量名中时,会导致错误。

Python 3.8.8 (default, Feb 24 2021, 21:46:12) 
[GCC 7.3.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> __HOGE = 1
>>> class hoge:
...     def __init__(
...             self,
...             name: str,
...             num_nodes: int,
...             momentum = 0.9,
...     ):
...         self.args = set(locals().keys())
...         global __HOGE
...         print(__HOGE)
... 
>>> a = hoge(name="name", num_nodes=1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 10, in __init__
NameError: name '_hoge__HOGE' is not defined

单个下划线不会发生这种情况_

>>> _HOGE = 1
>>> class hoge:
...     def __init__(
...             self,
...             name: str,
...             num_nodes: int,
...             momentum = 0.9,
...     ):
...         self.args = set(locals().keys())
...         global _HOGE
...         print(_HOGE)
... 
>>> a = hoge(name="name", num_nodes=1)
1

PEP 8 全局变量名称没有提及任何限制。

为通过 from M import * 使用而设计的模块应使用all机制来防止导出全局变量,或使用在此类全局变量前加下划线的旧约定(您可能希望这样做以指示这些全局变量是“模块非公共”)。

编程常见问题解答也没有。

在 Python 中,仅在函数内部引用的变量是隐式全局的。如果一个变量在函数体内的任何地方都被赋值,除非明确声明为全局变量,否则它被假定为局部变量。

虽然起初有点令人惊讶,但片刻的考虑解释了这一点。一方面,对已分配的变量要求全局性提供了防止意外副作用的障碍。另一方面,如果所有全局引用都需要全局,那么您将一直使用全局。您必须将对内置函数或导入模块组件的每个引用声明为全局。这种混乱会破坏全局声明识别副作用的有用性。

标签: pythonglobal-variables

解决方案


推荐阅读