if语句中初始化变量的范围是什么?
我是Python新手,所以这可能是一个简单的范围问题。 Python文件(模块)中的以下代码让我感到困惑:
if __name__ == '__main__':
x = 1
print x
在我工作过的其他语言中,这段代码会抛出一个异常,因为x
变量对if
语句是本地的,并且不应该存在于它之外。 但是这段代码执行并打印出1.任何人都可以解释这种行为吗? 是否所有变量都在全局模块中创建/可用于整个模块?
Python变量的作用域被分配给最内层的函数,类或模块。 像if
和while
块这样的控制块不计数,因此在if
内部分配的变量仍然限定为函数,类或模块。
(由发电机表达式或列表/设置/字典理解定义的隐函数都计算在内,因为这样做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中,只要变量在你需要的时候存在,就不会抛出异常。
上一篇: What's the scope of a variable initialized in an if statement?
下一篇: Is the practice of returning a C++ reference variable, evil?