Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 为什么可以';即使在下面的Python程序中使用关键字Global,我也能访问函数内的PAR吗?_Python 2.7_Global Variables - Fatal编程技术网

Python 2.7 为什么可以';即使在下面的Python程序中使用关键字Global,我也能访问函数内的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

我试图访问函数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

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@Shaun
S.M.\uu name\uuu==“Main”
因此,如果条件为
False
,则调用
S.M.func
时,会抛出错误
par
已在主模块中定义,但
S.M
是一个具有自己名称空间的不同对象。你所做的看起来很奇怪,你能不能不在
\uuuu name\uuuuuu==“\uuuu main\uuuu”
块之外定义
par