Python - 全球有什么优先权?

时间:2015-12-09 00:31:12

标签: python globals

对于使用其他软件包的软件包,我对全局变量有点困惑。从快速谷歌搜索;没有多少解释。

简单地说:变量是什么级别"全球化"使用global时?它是在模块级别,包级别还是解释器级别?即,在这样的设置中:

<Package>
   |- __init__.py
   |- Module.py
   |- Module2.py

并且在Module.py中使用了global个参数,是仅为该模块或整个包(包括Module2.py和/或_init__.py)或者在interperter级别进行全局化的变量(因为在翻译中运行的任何事情。)

另外,如果在__init__.py I from .Module import *中,导入的函数是否包含全局语句&#34;正确全球化&#34;该文件的任何变量?

1 个答案:

答案 0 :(得分:6)

全球变量的全球性如何?

Python中所谓的“全局”变量实际上是模块级的。实际上有全局全局变量,它们存在于Python 2中的__builtin__模块或Python 3中的builtins中,但您不应该触及它们。 (另外,请注意s的存在与否。__builtins__是它自己奇怪的事情。)

global声明的作用是什么?

global语句意味着仅针对它出现的函数,指定的变量名称或名称引用“全局”(模块级)变量,而不是局部变量。

import *怎么样?

天哪,不要那样做。全局足够糟糕,但导入它们更糟糕,使用import *执行此操作只是最糟糕的方式。导入系统对全局变量的作用对于新程序员来说是非常令人惊讶的,而且几乎从来都不是你想要的。

执行import *时,这并不意味着您的模块开始在导入模块的全局变量中查找变量查找。这意味着Python查看导入的模块,找到其“公共”全局变量*,并将其当前值分配给当前模块中具有相同名称的新全局变量

这意味着对新全局变量的任何分配都不会影响原件,并且对原件的任何分配都不会影响您的新变量。您使用import *导入的所有功能仍在查看原始变量,因此他们不会看到您对副本所做的更改,也不会看到他们对副本所做的更改。结果令人困惑。

说真的,如果您绝对必须使用其他模块的全局变量,请使用import othermodule语法导入它,并使用othermodule.whatever_global访问全局变量。

*如果模块定义了__all__列表,则“public”全局变量是其名称出现在该列表中的变量。否则,它们是名称不以下划线开头的变量。 def已运行的函数存储在普通变量中,因此它们包含在与其他变量相同的条件下。