if语句中初始化variables的范围是什么?
我是Python新手,所以这可能是一个简单的范围问题。 Python文件(模块)中的以下代码让我感到困惑:
if __name__ == '__main__': x = 1 print x
在我工作过的其他语言中,这段代码会抛出一个exception,因为x
variables对于if
语句是本地的,不应该存在于它之外。 但是这个代码执行,并打印1.任何人都可以解释这种行为? 所有的variables是在整个模块中创build的吗?
Pythonvariables的作用域被分配给最内层的函数,类或模块。 像if
和while
块这样的控制块不计数,所以在一个if
里面赋值的variables仍然被定义为函数,类或者模块。
(由生成器expression式或list / set / dict理解所定义的隐式函数和lambdaexpression式一样,不能将赋值语句填充到其中,但lambda参数和子句目标是隐含赋值的。
是的,它们处于相同的“本地范围”,实际上这样的代码在Python中很常见:
if condition: x = 'something' else: x = 'something else' use(x)
请注意, x
在条件之前未被声明或初始化,例如,它将在C或Java中。
换句话说,Python没有块级的范围。 但是要小心,例如
if False: x = 3 print(x)
这会明显引发NameError
exception。
python中的作用域遵循以下顺序:
-
search本地范围
-
search任何封闭函数的范围
-
search全球范围
-
search内置
( 来源 )
请注意, if
没有列出其他循环/分支结构,只有类,函数和模块在Python中提供了作用域,所以在if
块中声明的任何内容都与块之外的任何内容相同。 variables在编译时不检查,这就是为什么其他语言会抛出exception。 在Python中,只要variables存在于你需要的时候,就不会抛出exception。
与C这样的语言不同,Pythonvariables的作用范围是整个函数(或类或模块),而不仅仅是在最里面的“块”中。 就好像你在函数(或类或模块)的顶部声明了int x
,除了在Python中你不必声明variables。
请注意,variablesx
的存在仅在运行时检查 – 也就是说,当您到达print x
语句时。 如果__name__
不等于"__main__"
那么你会得到一个exception: NameError: name 'x' is not defined
__name__
NameError: name 'x' is not defined
。
正如Eli所说,Python不需要variables声明。 在C中你会说:
int x; if(something) x = 1; else x = 2;
但是在Python中声明是隐含的,所以当你赋值给x时会自动声明。 这是因为Python是dynamictypes的 – 它不能在静态types的语言中工作,因为取决于所使用的path,variables可以被使用而不被声明。 这将在编译时以静态types语言捕获,但是允许使用dynamictypes语言。
由于这个问题,静态types语言的唯一原因仅限于必须在if
语句之外声明variables。 拥抱dynamic!
是。 范围也是如此。 但当然不是function。
在你的例子中:如果if
语句中的条件是false, x
将不会被定义。
你是从命令行执行这个代码,因此, if
条件为真, x
被设置。 比较:
>>> if False: y = 42 >>> y Traceback (most recent call last): File "<pyshell#6>", line 1, in <module> y NameError: name 'y' is not defined