我是Python的新手,所以这可能是一个简单的范围问题。 Python文件(模块)中的以下代码让我感到困惑:
if __name__ == '__main__':
x = 1
print x
在我工作过的其他语言中,这段代码会引发异常,因为x
变量是if
语句的本地变量,不应该存在于它之外。但是这段代码执行并打印1.任何人都可以解释这种行为吗?是否在模块中创建的所有变量全局/可用于整个模块?
答案 0 :(得分:232)
Python变量的范围限定在分配它们的最内层函数,类或模块中。像if
和while
块这样的控制块不计数,因此在if
内分配的变量仍然限定为函数,类或模块。
(由生成器表达式定义的隐式函数或list / set / dict comprehension 执行计数,lambda表达式也是如此。您不能将赋值语句填充到其中任何一个,而是lambda参数和for
子句目标是隐式赋值。)
答案 1 :(得分:70)
是的,它们位于相同的“本地范围”中,实际上这样的代码在Python中很常见:
if condition:
x = 'something'
else:
x = 'something else'
use(x)
请注意,x
在条件之前未声明或初始化,例如在C或Java中。{/ p>
换句话说,Python没有块级范围。但是要注意,例如
if False:
x = 3
print(x)
这会明显引发NameError
例外。
答案 2 :(得分:34)
python中的范围遵循以下顺序:
搜索本地范围
搜索任何封闭函数的范围
搜索全球范围
搜索内置插件
(source)
请注意,if
和其他循环/分支结构未列出 - 只有类,函数和模块在Python中提供范围,因此在if
块中声明的任何内容都与已解除的任何内容具有相同的范围在街区外面。在编译时不检查变量,这就是其他语言抛出异常的原因。在python中,只要变量在您需要时存在,就不会抛出任何异常。
答案 3 :(得分:9)
正如Eli所说,Python不需要变量声明。在C中你会说:
int x;
if(something)
x = 1;
else
x = 2;
但是Python声明是隐式的,所以当你赋给x时它会被自动声明。这是因为Python是动态类型的 - 它不能在静态类型语言中工作,因为根据使用的路径,可以使用变量而不声明。这将在编译时以静态类型语言捕获,但允许使用动态类型语言。
由于此问题,静态类型语言仅限于必须在if
语句之外声明变量的唯一原因。拥抱动态!
答案 4 :(得分:9)
与C之类的语言不同,Python变量在其出现的整个函数(或类或模块)的范围内,而不仅仅在最里面的“块”中。就好像你在函数(或类或模块)的顶部声明int x
,除了在Python中你不必声明变量。
请注意,变量x
的存在仅在运行时检查 - 也就是说,当您到达print x
语句时。如果__name__
不等于"__main__"
,那么您将获得例外:NameError: name 'x' is not defined
。
答案 5 :(得分:2)
是。 for
范围也是如此。但当然不是功能。
在您的示例中:如果if
语句中的条件为false,则不会定义x
。
答案 6 :(得分:2)
您正在从命令行执行此代码,因此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
答案 7 :(得分:0)
请注意,由于仅在运行时检查Python类型,因此您可以使用以下代码:
if True:
x = 2
y = 4
else:
x = "One"
y = "Two"
print(x + y)
但是由于类型问题,我无法思考代码可以以其他方式正常运行的其他方式。