如何让函数在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
相关产品推荐
相关产品推荐

