为何给定Python代码可在PyCharm运行却无法在Jupyter执行?
代码在PyCharm正常运行但Jupyter报错的原因分析
先贴出问题代码:
import sys list1 = [1, 2, 4, 4, 2, 5, 6, 1, 8, 9, 10, 11, "sddvdfvdfv", "feefegrge"] def splitlist(list1, s): list2 = [] l = [] li = iter(list1) for _ in range(len(list1)): l = [] for i in range(s): try: p = next(li) except Exception: print("Original List >>") print(list1) print("Smaller list >>") list2.append(l) for k in list2: print(k, end="\t") sys.exit() else: l.append(p) list2.append(l) while True: s = int(input("Enter size for smaller lists>>")) if s <= len(list1) or s == 1: splitlist(list1, s) break
报错核心原因
从截图的SystemExit错误信息可知,问题出在sys.exit()的调用逻辑上:
- 在PyCharm这类IDE的脚本运行模式中,
sys.exit()会直接终止当前进程,程序正常结束,不会触发异常提示。 - 但Jupyter Notebook是交互式运行环境,它不会允许脚本直接终止整个解释器进程,而是会捕获
sys.exit()抛出的SystemExit异常,并将其显示为报错。你的代码在迭代器元素耗尽时会进入except块调用sys.exit(),这就触发了Jupyter的异常捕获机制。
快速修复方案
把sys.exit()替换为return即可,此时列表分割和结果打印的逻辑已经完成,不需要终止整个解释器:
修改后的except块代码:
except Exception: print("Original List >>") print(list1) print("Smaller list >>") list2.append(l) for k in list2: print(k, end="\t") return # 替换sys.exit()
另外补充一点:代码中外层的for _ in range(len(list1))属于冗余逻辑,迭代器会自动耗尽,这个循环会执行多余次数,也可以优化掉,但这不是报错的直接原因。
内容的提问来源于stack exchange,提问作者Pari
相关产品推荐
相关产品推荐

