我是 Python 新手,所以这可能是一个简单的范围界定问题。Python文件(模块)中的以下代码让我有些困惑:
if __name__ == '__main__':
x = 1
print x
在我使用过的其他语言中,此代码会引发异常,因为x
变量是if
语句的本地变量,不应存在于它之外。但是这段代码执行,并打印出 1。谁能解释这种行为?模块中创建的所有变量是否对整个模块都是全局的/可用的?
我是 Python 新手,所以这可能是一个简单的范围界定问题。Python文件(模块)中的以下代码让我有些困惑:
if __name__ == '__main__':
x = 1
print x
在我使用过的其他语言中,此代码会引发异常,因为x
变量是if
语句的本地变量,不应存在于它之外。但是这段代码执行,并打印出 1。谁能解释这种行为?模块中创建的所有变量是否对整个模块都是全局的/可用的?
Python 变量的作用域是分配它们的最里面的函数、类或模块。if
像和块这样的控制块while
不算在内,因此在 an 内分配的变量if
仍然作用于函数、类或模块。
(由生成器表达式或 list/set/dict 理解定义的隐式函数确实很重要,就像 lambda 表达式一样。您不能将赋值语句填充到其中的任何一个中,但 lambda 参数和for
子句目标是隐式赋值。)
是的,它们在同一个“本地范围”内,实际上这样的代码在 Python 中很常见:
if condition:
x = 'something'
else:
x = 'something else'
use(x)
请注意,x
它不会在条件之前声明或初始化,例如在 C 或 Java 中。
换句话说,Python 没有块级作用域。但是要小心,例如
if False:
x = 3
print(x)
这显然会引发一个NameError
例外。
python中的范围遵循以下顺序:
搜索本地范围
搜索任何封闭函数的范围
搜索全局范围
搜索内置插件
(来源)
请注意,if
没有列出其他循环/分支结构 - 只有类、函数和模块在 Python 中提供范围,因此在块中声明的if
任何内容都与在块外清除的任何内容具有相同的范围。在编译时不检查变量,这就是其他语言抛出异常的原因。在python中,只要变量在你需要的时候存在,就不会抛出异常。
正如 Eli 所说,Python 不需要变量声明。在 C 中你会说:
int x;
if(something)
x = 1;
else
x = 2;
但在 Python 中声明是隐式的,因此当您分配给 x 时,它会自动声明。这是因为 Python 是动态类型的——它不能在静态类型的语言中工作,因为根据所使用的路径,可能会在未声明的情况下使用变量。这将在编译时在静态类型语言中被捕获,但对于动态类型语言,它是允许的。
由于这个问题,静态类型语言仅限于在语句之外声明变量的唯一原因if
。拥抱动态!
Unlike languages such as C, a Python variable is in scope for the whole of the function (or class, or module) where it appears, not just in the innermost "block". It is as though you declared int x
at the top of the function (or class, or module), except that in Python you don't have to declare variables.
Note that the existence of the variable x
is checked only at runtime -- that is, when you get to the print x
statement. If __name__
didn't equal "__main__"
then you would get an exception: NameError: name 'x' is not defined
.
是的。范围也是如此for
。但当然不是函数。
在您的示例中:如果if
语句中的条件为假,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