在这种情况下Python变量的范围 - 包围和局部变量之间的差异

时间:2016-06-20 20:22:30

标签: python

我对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变量和局部变量有什么区别?

2 个答案:

答案 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