使用局部变量的 for 循环中的函数定义

ogr*_*ogr 3 python

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

myFuns = []
for i in range(10):
    j = i + 4
    def fun(): print(j)
    myFuns += [fun]
Run Code Online (Sandbox Code Playgroud)

在此循环结束时,myFuns 中的函数有所不同,但它们执行相同的操作,显然,这不是传递给 fun() 的新变量 j,而是 j 的引用。

我很高兴知道如何传递 j 的值而不仅仅是引用。

我不知道在循环中创建的变量可能比循环寿命更长,所以这对我来说是一个新领域......

che*_*ner 8

jfun是一个自由变量,调用会查找其值;fun不会将 的当前值烘焙j到其定义中。此外,由于缺少任何其他包含范围,对的调用将在全局范围中fun引用,其中其最后设置的值是其在循环的最后一次迭代中的值。j

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

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
Run Code Online (Sandbox Code Playgroud)

然而,闭包可能更合适:

# 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)]
Run Code Online (Sandbox Code Playgroud)