MST

星途 面试题库

面试题:Python闭包与变量作用域生命周期的交互

编写一个Python闭包函数,要求闭包内部函数能访问并修改外部函数的局部变量,阐述闭包中变量的作用域及生命周期管理机制,并且说明在多次调用闭包内部函数时,变量状态是如何保持和变化的。
37.6万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

Python闭包函数编写

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


closure = outer()
print(closure())
print(closure())

闭包中变量的作用域及生命周期管理机制

  1. 作用域
    • 外部函数的局部变量在外部函数执行结束后,正常情况下其作用域应该结束。但在闭包中,由于内部函数引用了外部函数的局部变量,这些变量的作用域被延长到内部函数的生命周期。
    • 在闭包内部,内部函数可以访问外部函数的局部变量。如果要修改外部函数的局部变量(在Python 3中),需要使用nonlocal关键字声明(Python 2没有nonlocal,处理相对复杂)。
  2. 生命周期管理机制
    • 当外部函数执行时,创建了局部变量。外部函数执行结束后,正常情况下这些局部变量应该被销毁。但由于闭包的存在,内部函数持有对外部函数局部变量的引用,所以这些变量不会被垃圾回收机制回收。只要闭包(内部函数对象)还在被使用,这些变量就会一直存在于内存中。

多次调用闭包内部函数时变量状态的保持和变化

每次调用闭包内部函数时,由于闭包的特性,它会记住上一次调用结束时外部函数局部变量的状态。例如在上述代码中,每次调用closure()时,num变量会在上一次的值基础上加1。因为闭包中num变量的生命周期一直持续,且每次调用内部函数时都是对同一个num变量进行操作,所以其状态能够保持并按照内部函数的逻辑进行变化。