为什么即使我在下面的 python 程序中使用关键字 global,我也无法在函数内部访问 par?



我正在尝试访问函数func()中的变量par(在主模块中声明)。但我得到了一个异常"未定义全局名称par"。我做错了什么?

Main.py
if __name__ == '__main__':
    import Second as S
    par = {1 : 'one'}
    S.func2()
def func():
    global par
    print('In func')
    print(par[1])

Second.py
import Main as M
def func2():
    M.func()

如果导入文件,则__name__的值将不会是"__main__",并且永远不会定义par dict。(__name__将改为模块的名称,在本例中为"temp"

if __name__ == "__main__":用于屏蔽仅在直接运行脚本时运行的代码位(即python temp.py)。如果文件已导入,则那个If条件将计算False

我认为您混淆的根源是,通常情况下,如果多个python文件导入同一个文件,它们会作为同一个条目/对象输入sys.modules,因此它们具有相同的命名空间。然而,被调用的主脚本有一个特殊的名称(__main__),所以如果您碰巧导入它,python不会看到它,而是创建一个新的python模块对象。

import sys
if __name__ == '__main__':
    import Second as S
    par = {1 : 'one'}
    S.func2()
def func():
    print(sys.modules["__main__"])  # here par is defined
    print(sys.modules["Second"].M)  # here it isn't
    global par
    print('In func')
    print(par[1])

您的第一个示例在repl.it上运行得很好,但您可能没有将其作为主文件运行。您的新示例显示,您在第二个脚本中获取文件源,因此__name__=="__main__"的计算结果为false,ergo:
par未初始化
为什么首先包括if分支?

顺便说一句,如果你只想打印par,你不需要全局声明。只有当你打算更改值时,全局声明才是必需的。

最新更新