当我在python shell中输入_
或__
时,我得到了返回的值。例如:
>>> _
2
>>>__
8
这里发生了什么?
答案 0 :(得分:15)
如果您使用的是IPython,则始终存在以下GLOBAL变量:
_
(单个下划线):存储以前的输出,就像Python的默认解释器一样。__
(两个下划线):next previous。___
(三个下划线):next-next previous。从IPython文档中了解更多相关信息:Output caching system。
答案 1 :(得分:6)
理论上这些只是普通的变量名。按照惯例,单个下划线用作不关心变量。例如,如果一个函数返回一个元组,并且你只对一个元素感兴趣,那么忽略另一个元素的Pythonic方法是:
_, x = fun()
在某些翻译中,_
和__
具有特殊含义,并存储以前评估的值。
答案 2 :(得分:3)
在Python中,它意味着你所说的意思。下划线是名称中的有效字符。 (但是,如果您使用的是IPython,请参阅Martin's fine answer。)
Python 2.7.5 (default, Aug 25 2013, 00:04:04)
[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.0.68)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> _
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name '_' is not defined
>>> _=2
>>> _
2
>>> __
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name '__' is not defined
>>> __=3
>>> __
3
那就是说,他们确实有一些特殊的语义。使用单个下划线启动名称不会以编程方式执行任何不同的操作,但按照惯例,它会告诉您该名称是私有的。但是如果你开始一个带有两个下划线的名字,解释器就会对它进行模糊处理。
>>> class Bar:
... _=2
... __=3
... _x=2
... __x=3
...
>>> y=Bar()
>>> y._
2
>>> y.__
3
>>> y._x
2
>>> y.__x
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: Bar instance has no attribute '__x'
>>> dir(y)
['_', '_Bar__x', '__', '__doc__', '__module__', '_x']
>>> y._Bar__x
3
答案 3 :(得分:2)
根据this,在iPython中:
application/json
(单个下划线):存储以前的输出,如Python的
默认翻译。_
(两个下划线):下一个上一个输出。您还可以根据它们的行来引用先前的输入和输出:
输入 __
其中_iX
是输入行号
输出: X
其中_X
是输出行号
<强>示例:强>
<强> X
强>
_
<强> In [1]: 9 * 3
Out[1]: 27
In [2]: _
Out[2]: 27
强>
__
<强> In [1]: 9 * 3
Out[1]: 27
In [2]: 4 * 8
Out[2]: 32
In [3]: __
Out[3]: 27
强>
_iX
<强> In [1]: x = 10
In [2]: y = 5
In [3]: _i1
Out[3]: u'x = 10'
强>
_X