pin_drop当前位置:知识文库 ❯ 图文

Python nonlocal关键字 - 嵌套函数变量修改


概述

nonlocal关键字用于在嵌套函数中声明变量属于外层(非全局)函数的作用域。它允许内层函数修改外层函数的局部变量,是闭包实现的关键。

语法

代码示例

nonlocal variable_name

基本用法

代码示例

def outer():
    count = 0
    def inner():
        nonlocal count
        count += 1
        return count
    return inner

counter = outer()
print(counter())
print(counter())

与global区别

对比项 global nonlocal
作用域 模块级别的全局变量 外层函数的局部变量
使用场景 修改全局变量 闭包中修改外层变量
变量来源 全局命名空间 外层函数作用域

代码示例

x = 'global'

def outer():
    x = 'enclosing'
    def inner():
        nonlocal x
        x = 'modified'
    inner()
    print(f"外层: {x}")

outer()
print(f"全局: {x}")

多层嵌套

代码示例

def level1():
    x = 1
    def level2():
        nonlocal x
        x = 2
        def level3():
            nonlocal x
            x = 3
        level3()
    level2()
    print(f"x = {x}")

level1()

注意事项

提示:nonlocal声明变量属于外层函数作用域。与global区别:nonlocal修改外层局部变量,global修改全局变量。用于闭包中修改外层变量。变量必须在外层函数中已定义。

小结

  • 作用域:nonlocal声明变量属于外层函数作用域

  • 区别:与global区别:nonlocal修改外层局部变量,global修改全局变量

  • 应用场景:用于闭包中修改外层变量

  • 变量要求:变量必须在外层函数中已定义

小贴士

nonlocal关键字在实现工厂函数和状态保持场景非常有用。它让内层函数能够"记住"并修改外层函数的状态,这是闭包的核心特性。但过度使用会让代码难以理解,建议在设计复杂的场景时考虑使用类来封装状态。

练习题

练习1

编写函数make_counter(start)创建指定起始值的计数器

练习2

编写函数make_accumulator()创建累加器闭包

常见问题

nonlocal关键字的作用是什么?

nonlocal关键字用于在嵌套函数中声明变量属于外层(非全局)函数的作用域,允许内层函数修改外层函数的局部变量。

nonlocal和global有什么区别?

nonlocal用于修改外层函数的局部变量,适用于嵌套函数场景;global用于修改模块级别的全局变量。nonlocal修改的是enclosing scope中的变量,而global修改的是global scope中的变量。

多层嵌套函数中nonlocal如何工作?

在多层嵌套中,nonlocal会向上查找最近的外层函数中定义的变量。如果多层都定义了同名变量,nonlocal会修改最近的那一层。

使用nonlocal有什么限制?

nonlocal声明的变量必须在外层函数中已定义,不能修改全局变量,也不能修改不存在的变量。同时,nonlocal只能用于函数嵌套的场景。

标签: nonlocal 嵌套函数 闭包 作用域 Python基础 函数

本文涉及AI创作

内容由AI创作,请仔细甄别

list快速访问

上一篇: Python global关键字用法 下一篇: Python闭包

poll相关推荐