
IPython(含 Jupyter Notebook)会自动创建一系列以 _ 开头的特殊变量,用于缓存历史输入(_i1, _i2…)、输出(_1, _2…)及最近三次结果(_, __, ___),便于快速复用。
ipython(含 jupyter notebook)会自动创建一系列以 `_` 开头的特殊变量,用于缓存历史输入(`_i1`, `_i2`…)、输出(`_1`, `_2`…)及最近三次结果(`_`, `__`, `___`),便于快速复用。
在 IPython 交互环境中(包括 Jupyter Notebook、JupyterLab 或终端版 IPython),为提升探索式编程效率,内核会自动维护一组隐藏变量,它们并非用户显式定义,但始终存在于当前命名空间中。执行 dir() 时看到的 _1, _2, _i3, _ih, _, ___ 等,正是这些由 IPython 内置机制生成的“快捷引用变量”。
? 核心变量分类说明
| 变量名 | 含义 | 等价访问方式 | 示例 |
|---|---|---|---|
_1, _2, _3, … |
第 1、2、3 次执行语句的输出结果 |
Out[1], Out[2], Out[3]
|
若 In[5]: 2 + 3 → Out[5]: 5,则 _5 == 5
|
_i1, _i2, _i3, … |
第 1、2、3 次执行的原始输入字符串 |
In[1], In[2], In[3]
|
_i5 == '2 + 3'(注意是字符串) |
_, __, ___
|
最近三次输出值(按时间倒序):_ = 最新,__ = 上一次,___ = 上上一次 |
— | 执行 10, 20, 30 后:_ == 30, __ == 20, ___ == 10
|
_i |
最后一次输入的字符串(等同 _i<latest></latest>) |
— | 若最后输入 len([1,2,3]),则 _i == 'len([1,2,3])'
|
_ih |
所有输入历史的列表(list[str]) |
In(即 get_ipython().user_ns['In']) |
_ih[-1] == _i |
_oh |
所有输出历史的字典(dict[int, object],键为行号) |
Out |
_oh[7] == _7 |
✅ 实际使用示例
# In[1]: "Hello" # In[2]: 42 * 2 # In[3]: [1, 2, 3] # 此时: print(_, __, ___) # 输出: [1, 2, 3] 84 'Hello' print(_2, _3) # 输出: 84 [1, 2, 3] print(_i1, _i3) # 输出: '"Hello"' '[1, 2, 3]' print(_ih[0], _ih[2]) # 输出: '' '[1, 2, 3]'(注意 _ih[0] 是空字符串,因 In[0] 未定义)
⚠️ 注意事项
- 这些变量仅在 IPython/Jupyter 环境中存在,标准 Python 解释器(
python命令)中不会生成; - 它们属于
IPython.core.interactiveshell.InteractiveShell的内部状态,不应被手动赋值覆盖(如_=100会破坏快捷访问); -
_i#和_#的编号对应于 IPython 的In[#]/Out[#]行号,跳过空行或注释行仍计数; - 使用
%reset out或%reset in可清除输出/输入历史(连带清空对应_#/_i#变量); - 若需检查是否在 IPython 环境中,可用:
from IPython import get_ipython if get_ipython() is not None: print("Running in IPython/Jupyter")
掌握这些自动变量,能显著提升交互式开发效率——无需反复复制粘贴,一行 _ 即可复用上一步结果,是 IPython 设计中极具实用性的“隐形助手”。


















