__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否,绝对不是。尽可能避免使用全局变量。:)