Python密码校验函数中的while循环为何会无限运行?
get_password()无限循环问题根因定位 核心问题原因
你的代码出现无限循环是两个逻辑错误共同导致的:
- 递归调用未修改当前作用域的循环判断变量
当首次输入的密码不符合长度规则时,当前函数作用域内的password会被赋值为None,随后进入while循环。循环内你直接递归调用get_password(),这会生成全新的独立函数调用栈,递归调用中获取到的合法密码只会在子调用的作用域内返回,完全不会修改当前外层函数里值为None的password变量。 - while循环无任何终止触发条件
外层函数中控制循环的password变量从进入循环开始就一直保持None值,循环体内既没有对该变量重新赋值的逻辑,也没有break类的跳出语句,password is None的判断条件永远成立,因此循环会无限执行。
额外逻辑缺陷:你将while循环放在了
if password is not None的判断块内,如果首次调用passwd()就返回None(用户首次无输入),代码根本不会进入重输引导逻辑,会直接返回None,和你预期的「持续引导直到输入有效密码」逻辑不符。
修复示例
去掉无意义的递归,直接在循环内完成输入获取、校验、变量更新即可:
def get_password(): password = passwd() # 只要密码不合法就持续循环重输 while password is None or len(password) < 7 or len(password) > 16: # 对已输入但不符合长度规则的场景打印提示 if password is not None: if len(password) < 7: print("Minimum length of password is 6. Please try again.") elif len(password) > 16: print("Maximum length of password is 16. Please try again.") # 重新获取输入,更新当前作用域的password变量 password = passwd() return password
内容的提问来源于stack exchange,提问作者avm
相关产品推荐
相关产品推荐

