if语句中初始化variables的范围是什么?

我是Python新手,所以这可能是一个简单的范围问题。 Python文件(模块)中的以下代码让我感到困惑:

if __name__ == '__main__': x = 1 print x 

在我工作过的其他语言中,这段代码会抛出一个exception,因为xvariables对于if语句是本地的,不应该存在于它之外。 但是这个代码执行,并打印1.任何人都可以解释这种行为? 所有的variables是在整个模块中创build的吗?

Pythonvariables的作用域被分配给最内层的函数,类或模块。 像ifwhile块这样的控制块不计数,所以在一个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) 

这会明显引发NameErrorexception。

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