默认情况下jupyter notebook仅显示单元格最后一个表达式输出,因ipython的_displayhook机制;可通过设置interactiveshell.ast_node_interactivity="all"全局启用多输出,或用display()函数显式推送多种类型对象,避免print()无法渲染富格式内容的问题。

默认情况下,Jupyter Notebook 只显示单元格中最后一个表达式的输出——这不是 bug,是 IPython 内核的 _displayhook 机制决定的。想让 df.head()、df.shape、plt.plot() 全部同时出现,得绕过这个限制。
用 InteractiveShell.ast_node_interactivity="all" 开关全局行为
这是最直接、影响范围最广的解法:让每个独占一行的表达式都触发输出,而非仅最后一行。
- 临时生效:在任意单元格运行
from IPython.core.interactiveshell import InteractiveShell+InteractiveShell.ast_node_interactivity = "all" - 永久生效:编辑
~/.ipython/profile_default/ipython_config.py(若不存在则新建),写入c.InteractiveShell.ast_node_interactivity = "all" - 注意:该设置对所有表达式生效,包括
1+1、len(my_list)这类简单计算,可能造成干扰;调试时建议临时开启,完成后再切回"last" - 重启 kernel 后才生效,单纯重启 notebook 页面不触发
用 display() 显式推送多个输出对象
比全局开关更精准,适合混排图表、表格、文本等多模态内容,且不影响其他单元格行为。
-
display()是 IPython 提供的显式输出函数,可多次调用,每次都会推一个 mime 对象到前端 - 支持混合类型:
display(df.head())、display(plt.gcf())、display("Summary:")会按顺序渲染 - matplotlib 图表需注意:避免混用
plt.show(),它会清空当前 figure 并强制渲染——和display(plt.gcf())冲突,导致重复或空白 - pandas DataFrame 默认渲染为 HTML 表格,但若用了
pd.set_option('display.max_rows', 10)等配置,display()仍会尊重这些设置
为什么 print() 不解决根本问题
print() 只输出纯文本(text/plain mime),无法渲染表格、SVG 图表、LaTeX 公式等富格式内容。
-
print(df.head())输出的是字符串形式的表格,无样式、不可排序、不支持列宽自适应 -
print(plt.plot([1,2,3]))输出类似[<matplotlib.lines.line2d object at>]</matplotlib.lines.line2d>,完全没图 - 真正需要“多个结果”时,90% 场景要的是可交互表格 + 可缩放图表 + 格式化文本,
print()无法满足
真正容易被忽略的是 matplotlib 的状态管理:同一个 figure 被 display() 推送后,再调 plt.show() 会清空它;而反复创建新 figure(如循环中未 plt.figure())又容易累积内存。多输出不是加几行代码的事,得理清 display pipeline 和绘图生命周期。











