关于python:在if语句中初始化变量的范围是什么?

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

在我工作过的其他语言中,这段代码会引发异常,因为x变量是if语句的本地变量,不应该存在于它之外。 但是这段代码执行并打印1.任何人都可以解释这种行为吗? 模块中创建的所有变量是全局/可用于整个模块吗?


Python变量的范围限定在分配它们的最内层函数,类或模块中。像ifwhile块这样的控制块不计数,因此在if内分配的变量仍然限定为函数,类或模块。

(由生成器表达式或list / set / dict理解定义的隐式函数和lambda表达式一样计数。你不能将赋值语句填充到其中任何一个,但lambda参数和for子句目标是隐式赋值。)


是的,它们处于相同的"本地范围",实际上这样的代码在Python中很常见:

1
2
3
4
5
6
if condition:
  x = 'something'
else:
  x = 'something else'

use(x)

请注意,x未在条件之前声明或初始化,例如,在C或Java中。

换句话说,Python没有块级范围。但是要小心,例如

1
2
3
if False:
    x = 3
print(x)

这显然会引发NameError异常。


python中的作用域遵循以下顺序:

  • 搜索本地范围

  • 搜索任何封闭函数的范围

  • 搜索全局范围

  • 搜索内置插件

(资源)

请注意,未列出if和其他循环/分支构造 - 只有类,函数和模块在Python中提供范围,因此在if块中声明的任何内容与在块外部解除的任何内容具有相同的范围。在编译时不检查变量,这就是其他语言抛出异常的原因。在python中,只要变量在您需要时存在,就不会抛出任何异常。


与诸如C之类的语言不同,Python变量在其出现的整个函数(或类或模块)的范围内,而不仅仅在最里面的"块"中。就好像你在函数(或类或模块)的顶部声明了int x,除了在Python中你不必声明变量。

请注意,仅在运行时检查变量x的存在 - 也就是说,当您到达print x语句时。如果__name__不等于"__main__"那么您会得到一个例外:NameError: name 'x' is not defined


正如Eli所说,Python不需要变量声明。在C中你会说:

1
2
3
4
5
int x;
if(something)
    x = 1;
else
    x = 2;

但是在Python声明是隐式的,所以当你赋给x时它会自动声明。这是因为Python是动态类型的 - 它不能在静态类型语言中工作,因为根据使用的路径,可以使用变量而不声明。这将在编译时以静态类型语言捕获,但使用动态类型语言是允许的。

由于此问题,静态类型语言仅限于必须在if语句之外声明变量的唯一原因。拥抱动感!


是。 for范围也是如此。但当然不是功能。

在您的示例中:如果if语句中的条件为false,则不会定义x


您正在从命令行执行此代码,因此if条件为真且x已设置。相比:

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