误删单元格后ctrl+z无效,应按esc进入命令模式再按z撤销;已运行代码可通过%history或locals()['in']找回;及时保存和备份才是根本保障。

误删单元格后按 Ctrl+Z 没反应,怎么办
Ctrl+Z 在 Jupyter 中只对「单元格内部编辑」生效(比如删掉几行代码),但对「删除整个单元格」无效。真正能撤销单元格删除的是命令模式下的 z 键。
操作步骤:
- 先按
Esc进入命令模式(左侧边框变蓝) - 再按
z(小写,非Ctrl+Z),即可恢复最近一次被删除或剪切的单元格 - 多次误删可连续按
z,逐层撤销 - 只要 notebook 窗口没关、内核没重启,这个撤销链就一直有效
想找回已运行但没保存的代码
只要代码曾经执行过(哪怕单元格已被删),Jupyter 就会把它记在输入历史里。直接运行以下任一命令即可查看:
-
%history:显示当前会话所有已运行代码 -
%history -n 10:只显示最近 10 条 -
%history -f backup.py:导出全部历史到backup.py文件
注意:%history 不会记录未执行的代码、注释、空行或魔法命令本身(如 %matplotlib inline)——只存实际送入内核执行过的语句。
用 locals()['In'] 手动提取历史输入
当 %history 因环境异常不可用时,可以退回到 Python 原生方式:
for line in locals()['In']:
if line is not None:
print(line)
这个方法依赖 IPython 的内部变量 In(一个列表,索引对应执行顺序),但它比 %history 更底层、更稳定。缺点是会打印出所有输入,包括 %timeit、??func 这类调试命令,需要手动过滤。
别等出事才想起来备份
撤销和历史恢复都是补救手段,不是保险柜。真实风险点在于:
- 关闭 notebook 页面后,
z和%history全失效 - 重启内核会清空
In列表(除非启用了 persistent history) - 剪切(
x)和删除(dd)在命令模式下行为一致,都走同一套撤销栈
日常建议:写几段就按 Ctrl+S;复杂逻辑拆成小单元格;对关键代码块,运行前先复制粘贴到临时文本文件里——这点比任何快捷键都管用。











