什么_和__在PYTHON中意味着什么

时间:2014-01-03 15:11:33

标签: python

当我在python shell中输入___时,我得到了返回的值。例如:

>>> _
2
>>>__
8

这里发生了什么?

4 个答案:

答案 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