我正在尝试访问函数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,你不需要全局声明。只有当你打算更改值时,全局声明才是必需的。