我对python变量的范围感到困惑。这是如何工作的
考虑以下示例
i = 12
if i==12 :
str = "is equal"
else:
str = "NOT"
print str //Prints is equal - recognized the string str
变量str
仅在if语句的范围内,其范围在else语句中丢失。由于python中没有吊装。我很困惑这个例子是如何运作的。我读了this帖子,它说明变量的范围是以下顺序
1-L(优先考虑局部变量)
2-E(附上变量)
3-G(全局变量)
4-B(内在蛋白)
我的问题是Enclosing变量和局部变量有什么区别?
答案 0 :(得分:4)
变量
str
仅在if语句的范围内,其范围在else语句中丢失。
不。 Python是函数作用域,而不是块作用域。输入if
块不会创建新范围,因此str
变量仍在print
的范围内。
封闭变量是包含给定函数的函数的变量。当你有封闭时它们会发生:
def f():
x = 3
def g():
print x # enclosing variable
g()
答案 1 :(得分:1)
Python没有通用块范围,只有函数范围(对class
声明等情况有一些额外的怪异)。函数内指定的任何名称在函数的生命周期内仍然有效。
嵌套范围适用于嵌套函数声明,例如:
def foo(a):
def bar(b):
return a + b
return bar
因此,在这种情况下,foo(1)(2)
会创建一个bar
,其封闭范围是与foo
的{{1}}来电,然后调用a == 1
,这将会看到bar(2)
为a
。
封闭范围也适用于1
个功能;他们可以读取在使用lambda
的范围内可用的变量,所以对于这样的事情:
lambda
val_to_key = {...} # Some dictionary mapping values to sort key values
mylist.sort(key=lambda x: val_to_key[x])
可用;它不会在val_to_key
函数的范围内,但sort
函数在声明时绑定封闭范围,因此可以使用lambda
。