Python 2.7 为什么可以';即使在下面的Python程序中使用关键字Global,我也能访问函数内的PAR吗?
我试图访问函数Par()中的变量Par(在主模块内部声明)。但我得到的例外是“全局名称PAR未定义”。我做错了什么Python 2.7 为什么可以';即使在下面的Python程序中使用关键字Global,我也能访问函数内的PAR吗?,python-2.7,global-variables,Python 2.7,Global Variables,我试图访问函数Par()中的变量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
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()
如果导入该文件,则
\uuu name\uuuuu
的值将不会是“\uuuuu main\uuuuuu”
,并且不会定义par
dict。(\uuuu name\uuuuu
将改为模块的名称,在本例中为“temp”
)
如果uuuu name_uuuu==“uuuuu main_uuuuu”:
用于屏蔽设计为仅在直接运行脚本时运行的代码位(即python temp.py
)。如果文件已导入,则If条件将计算为False
我认为您困惑的根源在于,通常情况下,如果多个python文件导入同一个文件,它们将作为同一个条目/对象输入sys.modules
,因此它们具有相同的名称空间。但是,被调用的主脚本会得到一个特殊的名称(\uuuuu main\uuuuu
),因此如果您碰巧导入了它,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上运行良好,但您可能没有将其作为主文件运行。您的新示例显示您在第二个脚本中源文件,因此
\uuuuuu name\uuuuu==“\uuuuuu main\uuuuu”
的计算结果为false,因此:PAR没有初始化!br> 为什么首先要包括if分支
顺便说一下,如果您只想打印PAR,就不需要全局声明。仅当您打算更改值时,才需要全局设置。您如何称呼它?请注意,定义(为什么不只是
par={1:'one'}
?)仅在脚本直接运行时发生,而不是在导入时发生。我已修改了我的程序以突出显示我想要实现的目标。我现在只是简单地导入模块temp,我得到了上面提到的异常。为什么这两个相互导入?你实际运行的是哪一个?我直接运行主模块。这两个相互导入的文件可能看起来很奇怪,但我这样做是为了调试。这不是问题,它必须正常工作。我同意你的看法。我修改了我的程序,以便清楚地解释我在做什么。现在请告诉我我做错了什么。@Shaun被调用的func
在命名空间s.M.func
中,在这个命名空间\uu name\uuu!=“\uuuu main\uuuuuu”
@GP89:请进一步澄清。我知道函数()在命名空间S.M函数()中被调用,但是PAR变量也在命名空间M中定义,所以它不应该被函数()访问。如果这是不可能的,它将是伟大的,如果你能建议一种方法来解决这个问题。Thanks@ShaunS.M.\uu name\uuu==“Main”
因此,如果条件为False
,则调用S.M.func
时,会抛出错误par
已在主模块中定义,但S.M
是一个具有自己名称空间的不同对象。你所做的看起来很奇怪,你能不能不在\uuuu name\uuuuuu==“\uuuu main\uuuu”
块之外定义par
?