What's the scope of a variable initialized in an if statement?
我是Python的新手,所以这可能是一个简单的范围问题。 Python文件(模块)中的以下代码让我感到困惑:
1 2 3 4 | if __name__ == '__main__': x = 1 print x |
在我工作过的其他语言中,这段代码会引发异常,因为
Python变量的范围限定在分配它们的最内层函数,类或模块中。像
(由生成器表达式或list / set / dict理解定义的隐式函数和lambda表达式一样计数。你不能将赋值语句填充到其中任何一个,但lambda参数和
是的,它们处于相同的"本地范围",实际上这样的代码在Python中很常见:
1 2 3 4 5 6 | if condition: x = 'something' else: x = 'something else' use(x) |
请注意,
换句话说,Python没有块级范围。但是要小心,例如
1 2 3 | if False: x = 3 print(x) |
这显然会引发
python中的作用域遵循以下顺序:
-
搜索本地范围
-
搜索任何封闭函数的范围
-
搜索全局范围
-
搜索内置插件
(资源)
请注意,未列出
与诸如C之类的语言不同,Python变量在其出现的整个函数(或类或模块)的范围内,而不仅仅在最里面的"块"中。就好像你在函数(或类或模块)的顶部声明了
请注意,仅在运行时检查变量
正如Eli所说,Python不需要变量声明。在C中你会说:
1 2 3 4 5 | int x; if(something) x = 1; else x = 2; |
但是在Python声明是隐式的,所以当你赋给x时它会自动声明。这是因为Python是动态类型的 - 它不能在静态类型语言中工作,因为根据使用的路径,可以使用变量而不声明。这将在编译时以静态类型语言捕获,但使用动态类型语言是允许的。
由于此问题,静态类型语言仅限于必须在
是。
在您的示例中:如果
您正在从命令行执行此代码,因此
1 2 3 4 5 6 7 8 9 | >>> if False: y = 42 >>> y Traceback (most recent call last): File"<pyshell#6>", line 1, in <module> y NameError: name 'y' is not defined |