[python] 作用域

Python中查找变量的顺序遵循LEGB规则(Local->Enclosing->Global->Built-in)。Python中的if/elif/elsefor/while等代码块不会创建新的作用域,只有defclasslambda才会改变作用域。这和C++中不同,C++中在{}代码块中创建的变量离开这个代码块后就会被析构,也即RAII的精髓所在。因此,Python中在iffor/while中创建的变量实际都是函数的局部变量,而不是iffor/while的局部变量。


globalnonlocal

  • 如果想在函数中修改全局变量,可以在函数中声明global;
  • 如果想在嵌套作用域里修改上一层作用域的非全局变量,可以在嵌套作用域中声明nonlocal

例子:

k=1
def fun():
    i=3
    # global k
    while i>0:
        i-=1
        k=3
    print(k)
fun()
print(k)

# 不加global输出:
#  3
#  1
# 加global输出:
#  3
#  3
def foo():
    k=1
    def fun():
        i=3
        # nonlocal k
        while i>0:
            i-=1
            k=3
        print(k)
    fun()
    print(k)
foo()

# 不加nonlocal输出:
#  3
#  1
# 加nonlocal输出:
#  3
#  3

你可能感兴趣的:(Python,python,开发语言)