我一直在使用IPython中的output caching system并注意到一些奇怪的行为,当使用单个下划线_
来获得先前的输出时,会产生意外的结果。
在写下这个问题之前,我不了解在IPython中实现的输出缓存系统,因此,如果我想通过访问以下代码来使用先前的输出,应该使用双下划线__
作为虚拟变量。特殊的_
-变量。
考虑以下会话:
Python 3.6.7 (default, Oct 22 2018, 11:32:17)
Type 'copyright', 'credits' or 'license' for more information
IPython 7.3.0 -- An enhanced Interactive Python. Type '?' for help.
In [1]: 2*3
Out[1]: 6
In [2]: 4 + _ # expect 10, OK
Out[2]: 10
In [3]: __, something = 1, 2
In [4]: 3*3
Out[4]: 9
In [5]: 3 + _ # expect 3+9=12, but:
Out[5]: 13
如上所示,在为__
赋值之后,使用_
并不能得到预期的结果。
在阅读了前面链接的参考文献之后,我知道我可能不应该对_
,__
或___
感到困惑。分配其中之一只会冻结所有其他内容吗?
该文档没有暗示这些问题。另外,由于常规python shell的行为有所不同,因此我发现这与直觉非常不符。 (在常规的shell中浏览了上面的示例之后,最终的输出与预期的一样!)
在此先感谢您的反馈!
答案 0 :(得分:3)
IPython具有(以及其他)3个特定变量:_
,__
和___
,
每次执行处决时,他们都会四处走动; _
-> __
,__
-> ___
,___
->丢弃,最后结果-> _
如果这些变量之一被分配;然后旋转停止。
In [1]: 1
Out[1]: 1
In [2]: 2 # _:1, __:'', ___:''
Out[2]: 2
In [3]: 3 # _:2, __:1, ___:''
Out[3]: 3
In [4]: ___ ='something', # _:3, __:2, ___:1
In [5]: __ # still gonna be 2
Out[5]: 2
In [6]: __ # still gonna be 2 again
Out[6]: 2
In [7]: _ # still 3
Out[7]: 3
值得讨论,但是很难修改。很难弄清这是什么意思,并且用户是否已经“修改”了_
,__
或___
;
在上面的示例中,将"something"
替换为1
,并且由于(1 is 1) == True
,那么IPython不会“检测到”您分配了下划线之一并继续转移内容。