You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让函数在while循环中修改变量?代码问题求助

问题分析与解决方案

这问题我太熟悉了!你的代码之所以会出现done永远是1、循环停不下来的情况,本质是两个核心问题在搞鬼:

1. Python不可变类型的参数传递特性

Python里像int、bool这类不可变类型,函数参数传递的是值的副本。你在lol函数里写的done = done + 1或者really_done = True,只是在函数内部创建了新的局部变量,完全不会影响外层循环里的done和really_done值。说白了,函数里外的这两个变量根本不是同一个东西!

2. 逻辑上的初始化错误

你外层的while循环里,每次都把done重置为0——这就意味着每次调用lol时,传入的done都是0,加1后永远是1,根本没机会累积到10。这是最容易被忽略的逻辑bug!


解决方案(两种可选,都适配你的模块结构)

方案一:用返回值传递状态(最符合Python风格)

调整函数让它返回更新后的done和really_done,同时把done的初始化移到循环外面:

def lol(done, really_done):
    done = done + 1
    print(done)
    if done == 10:
        really_done = True
    return done, really_done

really_done = False
done = 0  # 初始化移到循环外,避免每次重置
while really_done == False:
    done, really_done = lol(done, really_done)

运行这段代码,你会看到done从1逐步递增到10,然后循环自动终止。

方案二:用可变对象包装状态(不想改函数返回逻辑时用)

如果不想调整函数的返回值,可以用列表(可变类型)来包装done和really_done,这样函数内修改列表元素会直接反映到外部:

def lol(done_list, really_done_list):
    done_list[0] += 1
    print(done_list[0])
    if done_list[0] == 10:
        really_done_list[0] = True

really_done = [False]
done = [0]  # 初始化移到循环外
while really_done[0] == False:
    lol(done, really_done)

原理是列表是可变对象,函数接收的是列表的引用,修改列表内的元素会直接改变外部的列表内容。


内容的提问来源于stack exchange,提问作者userpyth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 11:14:12