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

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

if __name__ == '__main__':
    x = 1

print x

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


Python变量的作用域被分配给最内层的函数,类或模块。 像ifwhile块这样的控制块不计数,因此在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中,只要变量在你需要的时候存在,就不会抛出异常。

    链接地址: http://www.djcxy.com/p/36329.html

    上一篇: What's the scope of a variable initialized in an if statement?

    下一篇: Is the practice of returning a C++ reference variable, evil?