在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")
答案 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
被添加到本地范围,因此,它将对所有共享本地范围的代码可见。