面试题答案
一键面试Python闭包函数编写
def outer():
num = 0
def inner():
nonlocal num
num += 1
return num
return inner
closure = outer()
print(closure())
print(closure())
闭包中变量的作用域及生命周期管理机制
- 作用域:
- 外部函数的局部变量在外部函数执行结束后,正常情况下其作用域应该结束。但在闭包中,由于内部函数引用了外部函数的局部变量,这些变量的作用域被延长到内部函数的生命周期。
- 在闭包内部,内部函数可以访问外部函数的局部变量。如果要修改外部函数的局部变量(在Python 3中),需要使用
nonlocal
关键字声明(Python 2没有nonlocal
,处理相对复杂)。
- 生命周期管理机制:
- 当外部函数执行时,创建了局部变量。外部函数执行结束后,正常情况下这些局部变量应该被销毁。但由于闭包的存在,内部函数持有对外部函数局部变量的引用,所以这些变量不会被垃圾回收机制回收。只要闭包(内部函数对象)还在被使用,这些变量就会一直存在于内存中。
多次调用闭包内部函数时变量状态的保持和变化
每次调用闭包内部函数时,由于闭包的特性,它会记住上一次调用结束时外部函数局部变量的状态。例如在上述代码中,每次调用closure()
时,num
变量会在上一次的值基础上加1。因为闭包中num
变量的生命周期一直持续,且每次调用内部函数时都是对同一个num
变量进行操作,所以其状态能够保持并按照内部函数的逻辑进行变化。