Python闭包中修改外部变量的方法与原理

沈亦白
沈亦白
发布时间:2026-10-15 | 4人浏览过
原创

本文详解Python闭包中修改外部变量的方法。通过对比错误示例与正确用法,阐述使用nonlocal关键字声明外部变量的必要性。结合内存对象存储机制,解析闭包实例化及调用时的变量生命周期,帮助开发者理解函数嵌套与变量作用域的关系。

修改闭包内使用的外部变量

错误示例:

# 定义一个外部函数
def func_out(num1):
    # 定义一个内部函数
    def func_inner(num2):
        # 这里本意想要修改外部num1的值,实际上是在内部函数定义了一个局部变量num1
        num1 = 10
        # 内部函数使用了外部函数的变量(num1)
        result = num1 + num2
        print("结果是:", result)
    print(num1)
    func_inner(1)
    print(num1)
    # 外部函数返回了内部函数,这里返回的内部函数就是闭包
    return func_inner
# 创建闭包实例
f = func_out(1)
# 执行闭包
f(2)

在尝试修改闭包内引用的外部变量时,若直接赋值,Python会将其视为定义新的局部变量,而非修改外部变量。

# 定义一个外部函数
def func_out(num1):
    # 定义一个内部函数
    def func_inner(num2):
        # 这里本意想要修改外部num1的值,实际上是在内部函数定义了一个局部变量num1
        nonlocal num1  # 告诉解释器,此处使用的是 外部变量a
        # 修改外部变量num1
        num1 = 10
        # 内部函数使用了外部函数的变量(num1)
        result = num1 + num2
        print("结果是:", result)
    print(num1)
    func_inner(1)
    print(num1)
    # 外部函数返回了内部函数,这里返回的内部函数就是闭包
    return func_inner
# 创建闭包实例
f = func_out(1)
# 执行闭包
f(2)

小结

要修改闭包内使用的外部函数变量,必须使用nonlocal关键字。

闭包与闭包中修改外部变量

在函数嵌套的前提下,如果内部函数引用了外部函数的变量,且外部函数返回了该内部函数(即外部函数返回了一个引用了外部函数变量的内部函数),此时内部函数被称为闭包。例如以下代码展示了闭包的基本结构:

# 外部函数
def func_outer(a):
    # 内部函数
    def func_inner(b):
        c = a + b
        return c
    return func_inner
# 创建闭包实例
f = func_outer(1)
# 执行闭包
num1 = f(2)
num2 = f(3)
print(num1)
print(num2)

在此示例中,f是闭包的实例,func_inner函数被称为闭包。执行上述代码后,输出结果如下:

可以看出,f中封存了外部函数的变量1。当闭包实例建立后再次调用闭包实例时,相当于执行1+2和1+3,从而得到上述结果。通过debug调试可以看到,在执行完f = func_outer(1)代码后,内存中已经保存了一个函数对象:

当执行num1 = f(2)(即调用闭包)后:

此时,一个外部函数与内部函数的对象存储在了内存中。需要注意的是,在执行完f = func_outer(1)时并未立即产生这样一个对象,而是在调用时才会生成该对象。接着进入内部函数执行:

此时c=3便出现了,打印c的结果为3。num2=4的出现原理与3相同。

修改外部函数的变量

具体代码如下:

# 外部函数
def func_outer(a):
    # 内部函数
    def func_inner(b):
        nonlocal a
        a = 2
        c = a + b
        return c
    return func_inner
# 创建闭包实例
f = func_outer(1)
# 执行闭包
num1 = f(2)
num2 = f(3)
print(num1)
print(num2)

代码中增加了一行nonlocal a。这里的nonlocal关键字用于声明此处使用的是外部的a,而不是在内部函数中重新定义一个局部变量a。

以上就是Python进阶学习修改闭包内使用的外部变量的详细内容,更多关于Python修改闭包内外部变量的资料请关注本站其它相关文章!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表