即一个模块函数可以访问 __main__ 中的包围变量。对它的解释是什么呢?

5 个评论
没有范围 __main__ 。有一个 if ,它恰好将一个恰好被称为 __name__ 的变量与恰好是字符串字面的东西 "__main__" 进行比较。
@delnan: __main__ 是一个模块,每个模块都有一个相关的范围。 在解释器中试试 import __main__; type(__main__) (不是在IPython中)。
@斯文。我知道。OP应该知道在某些方面。但在我看来,OP反而混淆了if语句和部分条件,认为 if 引入了一个新的范围--这将是一个更紧迫的问题。(诚然,"没有范围 __main__ 是误导性的,严格来说)
@delnan:你是对的。现在回想起来,我不知道为什么我感到困惑。也许在凌晨3点调试代码毕竟不是一个好主意 :)
我刚刚偶然发现了这个完全相同的行为......还以为自己要疯了。很高兴看到有人已经问过这个问题了!在解释了答案之后,这种行为就很明显了...
python
scope
David Cournapeau
David Cournapeau
发布于 2011-01-24
5 个回答
Sven Marnach
Sven Marnach
发布于 2020-09-01
已采纳
0 人赞同

当前模块全局范围内的变量在模块中的任何地方都是可见的--这一规则也适用于 __main__ 模块。

From 圭多的教程 :

在执行过程中的任何时候,至少有三个嵌套的作用域,其命名空间可以直接访问。

  • the innermost scope, which is searched first, contains the local names
  • the scopes of any enclosing functions, which are searched starting with the nearest enclosing scope, contains non-local, but also non-global names
  • the next-to-last scope contains the current module’s global names
  • the outermost scope (searched last) is the namespace containing built-in names
  • @AA:主脚本被Python视为一个模块,名称为 __main__ 。 你甚至可以做 import __main__ (但通常这是个坏主意)。
    __main__ 中调用的函数中使用 __main__ 模块中定义的变量,而不明确传递这些变量,是否被认为是好的做法?
    @emilaz 不,绝对不是。尽量避免使用全局变量 :)
    Santiago Alessandri
    Santiago Alessandri
    发布于 2020-09-01
    0 人赞同

    这里的问题是。

    if __name__ == "__main__":
        foo = "bar"
    

    在该脚本中定义了一个名为foo的全局变量,因此该模块的任何函数都可以访问它。

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

    sinelaw
    sinelaw
    发布于 2020-09-01
    0 人赞同

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

    kynnysmatto
    kynnysmatto
    发布于 2020-09-01
    0 人赞同

    在Python中,有全局作用域,而函数有自己的作用域。所以,如果你在name==main下定义foo,它就在全局范围内。另外,在一个函数中使用一个尚未声明的变量并不是一个错误,如果它在函数被调用时已经被声明的话。

    giwyni
    giwyni
    发布于 2020-09-01
    0 人赞同

    正如sinelaw所指出的,摆脱这种烦扰和无心之失的方法是使用一个函数。这个函数可以是在 "如果 主要 :' like this: