__python中的main和作用域

__python中的main和作用域,python,scope,Python,Scope,不知何故,我对以下行为感到惊讶: def main(): print "%s" % foo if __name__ == "__main__": foo = "bar" main() i、 e.模块函数可以访问\uuuuu main\uuuu中的封闭变量。它的解释是什么?foo是一个模块全局变量(它不在任何函数中)。模块中的所有作用域都可以访问它。当前模块全局作用域中的变量在模块中的任何地方都可见--此规则也适用于\uuuuuu主模块 发件人: 在执行期间的任何时候,

不知何故,我对以下行为感到惊讶:

def main():
    print "%s" % foo

if __name__ == "__main__":
    foo = "bar"
    main()

i、 e.模块函数可以访问
\uuuuu main\uuuu
中的封闭变量。它的解释是什么?

foo是一个模块全局变量(它不在任何函数中)。模块中的所有作用域都可以访问它。

当前模块全局作用域中的变量在模块中的任何地方都可见--此规则也适用于
\uuuuuu主模块

发件人:

在执行期间的任何时候,至少有三个嵌套作用域的名称空间可以直接访问:

  • 最里面的范围(首先搜索)包含本地名称
  • 任何封闭函数的作用域,从最近的 封闭范围,包含非本地名称,但也包含非全局名称
  • 倒数第二个作用域包含当前模块的全局名称
  • 最外层的作用域(最后搜索)是包含内置名称的命名空间

python中有全局作用域,函数有自己的作用域。因此,如果您在名称==main下定义foo,它就在全局范围内。此外,在函数中使用尚未声明的变量并不是一个错误,如果它将在调用函数时声明。

这里的问题是:

if __name__ == "__main__":
    foo = "bar"
在该脚本中定义名为foo的全局变量。因此,该模块的任何功能都可以访问它


上面列出的代码是模块的全局代码,不在任何函数中。

正如sinelaw指出的,解决这一麻烦和意外错误的方法是使用函数。此函数可以位于“ifmain:”中,如下所示:

if __name__ == "__main__":
    def mainlet():
        foo = "bar"
    mainlet()

没有作用域
\uuuu main\uuuu
。有一个
if
将一个碰巧被调用的变量
\uuuuuu name\uuuuuu
与字符串literal
“\uuuuu main\uuuuuuu”
@delnan:
\uuuuu main\uuuuuuuu
进行比较:
是一个模块,每个模块都有一个关联的作用域。尝试
import\uuuuu main\uuuuuu;在解释器中键入(\uuuu main)
(不是在IPython中)。@Sven:我知道。OP总有一天会知道的。但在我看来,OP反而混淆了if语句和部分条件,并认为
if
引入了一个新的范围,这将是一个更紧迫的问题。(无可否认,“没有范围<代码>\uuuuu main\uuuuuu
严格来说是误导性的)@德尔南:你说得对。现在回想起来,我不知道为什么我会感到困惑。也许在凌晨3点调试代码毕竟不是一个好主意:)我只是被完全相同的行为绊倒了……我想我疯了。很高兴看到别人已经问了这个问题!当答案被解释时,这种行为是显而易见的…@AA:主脚本是Python将其视为名为
\uuuuu main\uuuu
的模块。您甚至可以执行
导入
(但通常这是个坏主意)。在
\uuuuu main\uuuu
中调用的函数中使用
\uuuuu main\uuuu
模块中定义的变量而不显式传递它们是否被视为良好做法?@emilaz否,绝对不是。尽可能避免使用全局变量。:)