Python 嵌套函数作用域与 nonlocal 语句深入解析
1. 循环变量与默认参数
在大多数情况下,不再需要通过默认参数将值传递给 lambda 函数。但在循环中定义嵌套函数时,存在一个特殊情况。如果在函数内部的循环中定义了 lambda 或普通函数,并且该嵌套函数引用了被循环改变的封闭作用域变量,那么循环内生成的所有函数将具有相同的值,即该变量在最后一次循环迭代时的值。
示例代码
def makeActions():
acts = []
for i in range(5): # 尝试记住每个 i
acts.append(lambda x: i ** x) # 但所有函数都记住了最后一个 i 的值!
return acts
acts = makeActions()
print(acts[0])
print(acts[0](2)) # 所有都是 4 ** 2,4 是最后一个 i 的值
print(acts[1](2)) # 本应是 1 ** 2 (1)
print(acts[2](2)) # 本应是 2 ** 2 (4)
print(acts[4](2)) # 只有这个应该是 4 ** 2 (16)
解决方案
为了解决这个问题,我们需要使用默认参数来保存变量的当前值。因为默认参数是在嵌套函数创建时求值的,而不是在调用时,所以每个函数都会记住自己的 i 值。
def makeActions
超级会员免费看
订阅专栏 解锁全文
126

被折叠的 条评论
为什么被折叠?



