鱼C论坛

 找回密码
 立即注册
查看: 1893|回复: 1

[已解决]请问这代码为什么返回不是149,为什么是返回999

[复制链接]
发表于 2023-4-20 09:00:47 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
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())

最佳答案
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。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-23 15:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表