python中作用域的目的是什么,由缩进确定

时间:2013-12-24 05:04:17

标签: python

在mac os-x的python 2.7.5中,我可以编写以下行。我的问题是变量age1在内部块中声明,因此在后续外部块中不可见。但python编译并没有抱怨。如果我对行age1 = 25发表评论,那么python会抱怨未声明变量age1。

在java / c ++等其他语言中,范围内声明的变量(由{}确定)在范围外不可见。所以我的问题是缩进确定的python范围的目的是什么。

age = 41
if age >= 41:
 print(">=41")
 age1 = 25 #this is declared inside the scope of print and should not be visible outside
if age1 == 25:
 print("==25")

1 个答案:

答案 0 :(得分:2)

从这个excellent answer开始,Python中只有四个范围。

LEGB 规则。

  

升。本地。 (在函数内以任何方式分配的名称(def或   lambda)),并没有在该函数中声明为全局。

     

电子。封闭功能本地人。 (名称在任何和所有的本地范围内   封闭函数(def或lambda),形成从内到外。

     

-G。全球(模块)。在模块文件的顶级分配的名称,   或者在文件中的def中声明为全局。

     

B中。内置(Python)。在内置名称模块中预先指定的名称:   开放的,范围,的SyntaxError,...

如您所见,基于缩进/控制块,python不会限制变量的可见性。

因此,如果该代码在函数内,那么该函数在创建后将对该代码的所有部分可见。

如果该代码在模块中,则该变量在创建后将对模块的所有部分可见。

当您尝试访问变量时,首先搜索本地范围,如果没有找到,则搜索关闭范围,如果未找到,则搜索模块范围,如果未找到则搜索内建范围,并且如果没有找到错误将被抛出。

立即检查此功能,

def func(x):
    if x == 0: y = 1
    print locals()

func(1)
func(0)

<强>输出

{'x': 1}
{'y': 1, 'x': 0}

在第一种情况下,未创建y,因此它不在本地范围内。但在第二种情况下,y被添加到本地范围,因此,它将对所有共享本地范围的代码可见。