Colab环境运行Python代码出现死循环、未达预期迭代效果问题
Colab中运行代码出现无限循环的问题排查
核心问题定位
- 循环逻辑失效:内层for循环里的
break语句仅能跳出当前所属的最内层循环,无法终止外层的while True死循环。只要内层for遍历完密钥的全部字符,外层循环就会立刻开启下一轮遍历,完全没有终止机制。 - 变量未定义的硬错误:
- 初始列表
[a, b, c]里的a、b、c没有加引号,属于未定义的标识符,直接运行会触发NameError - 长度判断用到的
encrypt_text变量全程没有定义,代码运行时根本获取不到目标长度,永远无法满足len(key_letters) == len(encrypt_text)的判断条件
- 初始列表
- 缩进语法错误:
if len(key_letters) == len(encrypt_text):语句前多了一层缩进,和for循环内的代码块层级不匹配,Python解释器运行时会直接抛出IndentationError,根本无法执行长度判断的逻辑 - 逻辑冗余:本身要实现“密钥循环填充至和明文等长”的Vigenère密码标准逻辑,用双层死循环实现很容易出现漏洞,完全可以通过更简洁的逻辑完成。
修正实现代码
你原本的预期目标是:让
key_letters按encryption_key的内容循环填充,直到总长度和待加密文本长度一致,避免无限循环。
# 提前定义所有依赖变量,补上缺失的字符串引号 key_letters = ['a', 'b', 'c'] encryption_key = 'hello world' # 必须先定义待加密文本变量,否则无法计算目标长度 encrypt_text = "你的实际待加密内容" # 计算还需要补充多少个密钥字符才能达到目标长度 remaining_length = len(encrypt_text) - len(key_letters) # 按取模逻辑循环截取密钥字符,不需要死循环 fill_content = [encryption_key[i % len(encryption_key)] for i in range(remaining_length)] # 拼接得到最终的密钥列表 key_letters += fill_content
无限循环的触发原理
举个具象的例子:假设encrypt_text总长度为15,encryption_key长度为11。内层for循环每完整跑一轮,就会往key_letters里添加11个元素。即使某次循环添加完刚好凑到15的长度,执行break也只是跳出了内层的for循环,外层的while True根本没有终止判断,会立刻进入下一轮循环重新开for遍历,继续往列表里追加元素。之后列表长度只会越来越长,再也无法回到“长度等于encrypt_text”的判断点,就会进入永远跑不完的死循环,在Colab里表现为代码一直转圈没有输出。
内容的提问来源于stack exchange,提问作者Tiffany Y
相关产品推荐
相关产品推荐

