hahadaxiao 发表于 2023-4-20 09:00:47

请问这代码为什么返回不是149,为什么是返回999

def test3():
    func_list = []
    for i in range(1,4):
      def test4():
            return i**2
      func_list.append(test4)

    return func_list

f1,f2,f3 = test3()
print(f1(),f2(),f3())

isdkz 发表于 2023-4-20 09:16:38

这段代码中的问题出在闭包(closure)上。当你在test3()函数中定义test4()函数时,它会捕获i变量的引用,而不是它的值。当test3()循环结束时,i的值变为3。所以,当你调用f1(), f2()和f3()时,它们实际上都引用了同一个i变量,而此时i的值为3。

这就是为什么你得到的结果是9, 9, 9,而不是1, 4, 9。为了解决这个问题,你可以使用一个默认参数来捕获i的当前值,这样每个test4函数实例都有一个不同的i值。这是修改后的代码:

def test3():
    func_list = []
    for i in range(1, 4):
      def test4(i=i):
            return i**2
      func_list.append(test4)

    return func_list

f1, f2, f3 = test3()
print(f1(), f2(), f3())# 输出将是 1, 4, 9

现在,每个test4函数实例都有一个与i当前值相对应的默认参数,所以输出结果将是1, 4, 9。
页: [1]
查看完整版本: 请问这代码为什么返回不是149,为什么是返回999