python - 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 中,仅在函数内部引用的变量是隐式全局的。如果一个变量在函数体内的任何地方都被赋值,除非明确声明为全局变量,否则它被假定为局部变量。
虽然起初有点令人惊讶,但片刻的考虑解释了这一点。一方面,对已分配的变量要求全局性提供了防止意外副作用的障碍。另一方面,如果所有全局引用都需要全局,那么您将一直使用全局。您必须将对内置函数或导入模块组件的每个引用声明为全局。这种混乱会破坏全局声明识别副作用的有用性。
解决方案
推荐阅读
- java - 如何从服务器下载视频文件?
- python-3.x - 散点图 matplotlib 结果相同的颜色
- mule - “执行多次捕获异常策略”
- hadoop - 从 sqoop 1.4.7 导入 HDFS 的表很好。在导入 hive 3.1.1 时
- docker - “优雅地停止”是什么意思?
- javascript - 从 php 到 javascript 的增值税验证
- react-native - 如何在屏幕上的特定 x,y 坐标处获取对组件的引用
- python - plt.bar(x,y) 抛出“AttributeError”
- android - Gradle 脚本:如何在 XML 文件中创建和写入数据
- mysql - 如何对两个表使用 max