为什么在ipython中为双下划线__赋值会破坏单下划线_的行为?

时间:2019-05-10 06:22:09

标签: python ipython

我一直在使用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中浏览了上面的示例之后,最终的输出与预期的一样!)

在此先感谢您的反馈!

1 个答案:

答案 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不会“检测到”您分配了下划线之一并继续转移内容。