Python之关键字nonlocal

nonlocal: 非局部的
nonlocal 可以使你在嵌套函数内部修改外层(非全局)作用域的变量

在函数的内部,我们在构建一个子函数去影响父函数变量的值,这样的行为,就是闭包。  
nonlocal是Python3新增的作用域关键词。  
在Python2中,闭包函数可以读取到父函数的变量,但无法修改该变量的值。为此,我们经常要把变量声明为global全局变量,但这就打破了闭包的性质。

为了解决这个问题,Python3引入了nonlocal。通过在闭包函数中声明nonlocal变量,就可以在闭包函数内访问和修改父函数内的同名变量。

一个没有使用 nonlocal 的例子

def outer_function():
    a = 20
    def inner_function():
        a = 30
        print("Inner function: ", a)
    inner_function()
    print("Outer function: ", a)

outer_function()

输出:
Inner function: 30
Outer function: 20

使用 nonlocal 关键字

def outer_function():
    a = 20
    def inner_function():
        nonlocal a
        a = 30
        print("Inner function: ", a)
    inner_function()
    print("Outer function: ", a)

outer_function()

输出
Inner function: 30
Outer function: 30

需要注意的是,nonlocal 不会影响全局作用域中的变量。全局变量需要使用 global 关键字来引用。

总结:

  • nonlocal 用于嵌套函数中,用于在嵌套函数里引用最近的外层函数作用域中的变量。
  • nonlocal 不会影响到全局作用域中的变量,只影响最近的外层作用域(也就是包含 nonlocal 的函数的最近的父函数)。
  • 使用 nonlocal 时,变量名必须已经在外层函数作用域中定义,否则会抛出一个 SyntaxError。

你可能感兴趣的:(python,python)