在Python中,如何避免函数中引用的非局部变量随着函数外部的赋值而改变?

问题描述 投票:0回答:1

例如,我想实现一个带有一个参数 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 是在函数定义时计算的。然而,在我看来,这种方法并不优雅,因为它引入了不必要的默认参数。

python
1个回答
0
投票

为了避免返回带有不必要参数和默认值的函数,您可以将内部函数包含在额外的变量闭包中:

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

演示:https://ideone.com/uVxby6

© www.soinside.com 2019 - 2024. All rights reserved.