为什么Jupyter Notebook会先执行存在语法错误的单元格部分代码?
二者执行逻辑不同的核心原因是执行模式的差异
标准Python脚本执行逻辑
标准Python解释器运行.py脚本时,会先对整个文件的全部代码做全量语法解析、生成抽象语法树(AST),只要文件内存在任意语法错误,解析阶段就会直接抛出异常,不会执行任何一行代码。你通过!python test.py运行时直接报错、没有任何执行输出,就是这个机制导致的。Jupyter单元格执行逻辑
Jupyter Notebook的代码单元格默认使用IPython内核,采用交互式逐顶级语句编译执行的逻辑:它会把单元格内的代码拆分为多个独立的顶级语句,逐个完成「编译检查-执行」的流程,前一个语句编译、执行完成后,才会处理下一个语句。
对应你给出的示例:import语句、random.seed(16)、整个while循环都是语法合法的独立顶级语句,所以会依次正常执行,while循环内部的print会输出所有随机数,直到循环正常退出。直到内核处理到最后一段if n==20: break语句时,才会对这段代码做编译检查,此时发现break不在循环或switch结构中,才抛出语法错误,因此会出现先有执行输出、后报语法错的现象。
内容的提问来源于stack exchange,提问作者Michael Szczesny
相关产品推荐
相关产品推荐

