例如,我想实现一个带有一个参数 n 的函数,它返回一系列函数,这些函数按顺序返回 0, 1, 2, ... , n-1,如果我按以下方式实现它方式:
def outer(n):
res = []
for i in range(n):
def inner():
return i
res.append(inner)
return res
那么这些函数都会返回最后一个数字,即n-1。我知道这是因为
i
函数中的 inner
实际上只是对 i
函数中 outer
的引用,它将通过迭代重新分配。有什么办法可以解决这个问题吗?
到目前为止我发现的一个可能的解决方案是:
def outer(n):
res = []
for i in range(n):
def inner(i = i):
return i
res.append(inner)
return res
通过使用默认参数,i 是在函数定义时计算的。然而,在我看来,这种方法并不优雅,因为它引入了不必要的默认参数。
为了避免返回带有不必要参数和默认值的函数,您可以将内部函数包含在额外的变量闭包中:
def outer(n):
res = []
for i in range(n):
def closure(i):
def inner():
return x
x = i
return inner
res.append(closure(i))
return res
for f in outer(3):
print(f())
输出:
0
1
2