在由 IPython 内核提供支持的 Jupyter 笔记本中重置下划线 (`_`) 变量

Ian*_*anS 5 python ipython jupyter-notebook

编辑:该问题已在GitHub中报告。我将问题留在这里,以防它可以帮助其他人找到问题(我无法找到)。


在使用 Jupyter 笔记本时,为了方便起见,我经常使用该_变量(它返回最新代码执行的输出)。但是,当_用作未使用变量的占位符(Python 中的典型用例)时,它会破坏第一个用例。

请注意,这在 IPython 控制台中按预期工作。下面,_再次保存在循环中用作未使用占位符后的最新返回值。

In [1]: 'value'
Out[1]: 'value'

In [2]: _
Out[2]: 'value'

In [3]: for _ in range(2):
   ...:     print('hello')
   ...:     
hello
hello

In [4]: _
Out[4]: 1

In [5]: 'value'
Out[5]: 'value'

In [6]: _
Out[6]: 'value'
Run Code Online (Sandbox Code Playgroud)

但是,在 Jupyter Notebook 中运行相同的代码后,无论最新的输出是什么,_都将永远保留(循环中的最后一个值)。1如果我尝试这样做del _,那么_将不再是可访问的变量。

简而言之,_Python 中该变量的两种用法在 Jupyter Notebook 中发生冲突,但在 IPython 控制台中则不然。这只是一个不便,但我很想知道如何解决它 - 或者为什么会这样。


编辑

$ python --version
Python 3.6.3 :: Anaconda, Inc.
$ ipython --version
6.5.0
$ jupyter notebook --version
5.6.0
Run Code Online (Sandbox Code Playgroud)

use*_*729 1

另一种方法如下:

import builtins
del builtins._
del _
del __
del ___
Run Code Online (Sandbox Code Playgroud)

只需忽略任何可能的错误即可。特别是,如果您得到NameError: name '_' is not defined则必须继续删除__等。

执行此操作后,它将继续从后续单元格开始工作(即此方法无助于获取前一个单元格Out[n]

说明:在另一个答案引用的代码片段中(来源),

  • _该代码检查, __,的值___(注意range(1, 4)不包括4!因此分配____是无用的)是否未定义或与最后 3 个Out[n]:相同的对象。
  • 如果是,那么一切都会更新。
  • 否则,不会更新任何内容。

_因此,如果、__和全部___未定义,则从下一个单元格开始,输出将分配给_。重要的是,如果其中任何一项不正确,它将无法工作

del builtins._是必要的,因为否则如果用户或某个图书馆之前做了类似的事情

import gettext
gettext.NullTranslations().install()
Run Code Online (Sandbox Code Playgroud)

然后builtins._就会被覆盖,需要删除。