Jupyter单元格无限运行:中断后可完成计算的原因与修复方案
问题
计算本该在0.2秒内完成,却陷入无限循环。中断Jupyter单元格时会出现两种情况:1. 正常中断;2. 计算完成并输出结果。
背景:需要验证某个值是否在字典中,编写了如下遍历字典的代码:
i = 0 j = 0 while i < 9 : try : if dictionary[i] == "my_value" : j = i break except : i +=1
其中j用于存储目标值在字典中的键位置。
实际运行时,代码陷入无限循环。打印每一步的i时,会卡在某个随机数值(如7);中断单元格后,会继续输出8、9并得到j = 2的预期结果。手动中断的结果不稳定,有时会直接终止计算。
问题原因
- 死循环核心诱因:只有当访问
dictionary[i]抛出异常(比如键i不存在)时,i才会执行递增操作。如果某个i对应的键存在,但值不等于"my_value",这时既不会触发异常,也不会执行i +=1,循环会一直卡在这个i值上,导致无限运行。 - 中断后输出延迟的原因:Jupyter的打印输出存在缓冲机制,循环中打印的
i值没有实时显示,中断时缓冲的内容被一次性输出,看起来像是中断后代码还在运行,实际上是之前的输出被延迟了。
修复方案
方案1:修正循环内的i递增逻辑
确保无论是否触发异常,i都能正常递增,彻底避免死循环:
i = 0 j = 0 while i < 9 : try : if dictionary[i] == "my_value" : j = i break except : pass # 键不存在时跳过即可 i +=1 # 无论当前键是否存在、值是否匹配,i都要递增
方案2:改用Python原生的字典遍历方式
不需要手动维护索引i,直接遍历字典的键值对,代码更简洁且不易出错:
j = 0 for key, value in dictionary.items(): if value == "my_value": j = key break
方案3:仅验证值是否存在的简化写法
如果只需要确认"my_value"是否在字典中,不需要存储键,可以直接用:
if "my_value" in dictionary.values(): # 这里编写值存在时的处理逻辑
内容的提问来源于stack exchange,提问作者Rayjine
相关产品推荐
相关产品推荐

