使用本地变量在for循环中定义函数

3

我有些不知所措。 我正在尝试在for循环内定义一个函数。该函数使用在循环内定义的变量,可能看起来类似于:

myFuns = []
for i in range(10):
    j = i + 4
    def fun(): print(j)
    myFuns += [fun]

最初的回答:
在循环结束时,我在myFuns中的函数是不同的,但它们做相同的事情,显然,传递给fun()的不是新变量j,而是j的引用。
我很想知道如何传递j的值,而不仅仅是引用。
我不知道在循环中创建的变量可以超出循环的范围,所以这对我来说是新领域...

1
为什么你不能只是做myFuns.append(j)呢? - undefined
1
这与一个叫做“闭包”的概念有关。它们只是从创建它的函数中引用j。如果你不介意一点JavaScript,可以参考这个链接:https://dev59.com/v3RB5IYBdhLWcg3wAjNH - undefined
看这个 https://docs.python-guide.org/writing/gotchas/#late-binding-closures - undefined
Python中的作用域是有限的;请参考https://dev59.com/J3VC5IYBdhLWcg3wcgud#292502。由循环或其他复合语句引起的“块”*不会*创建新的作用域。 - undefined
1个回答

7

j是一个自由变量,在调用fun时会查找其值;fun不会将当前j的值嵌入其定义中。此外,如果没有其他包含作用域,则对fun的调用将引用全局作用域中的j,其最后设置的值是循环的最后一次迭代中的值。

为了在定义fun时实际存储j的固定值,您需要将其作为带有默认值的参数传递:

myFuns = []
for i in range(10):
    j = i + 4
    def fun(j=j):
        print(j)
    myFuns.append(fun)  # Don't use += [...] for a single item

然而,闭包可能更加合适:

# Here, j is a free variable in _, but its value comes from the local
# variable j defined by make_fun, not the global scope.
def make_fun(j):
    def _():
        return j
    return _

myFuns = [make_fun(i) for i in range(10)]

谢谢。这有点奇怪,我需要一些时间来理解这个,我想。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接