PYTHON中的_和__代表什么意思?

11

当我在Python shell中输入___时,会返回一些值。例如:

>>> _
2
>>>__
8

这里发生了什么?


你正在使用“普通”的Python shell吗? - smeso
@BartoszKP:我没有添加“谢谢”,这是原始帖子中就有的。我只纠正了拼写错误而已。 - Infinite Recursion
2
针对 _,您可以参考此答案 Python 中的 _ - Charles0429
@BartoszKP在编辑中没有添加任何内容。他只是更正了一个单词拼写错误。 - Skindeep2366
@Payeli 对,抱歉,我误读了它。无论如何 - 你应该删除它 :) - BartoszKP
当我输入__name__时,我得到了'__main__'。我认为这是全局变量。 - tdolydong
4个回答

16

如果您正在使用IPython,则以下全局变量始终存在:

  • _ (一个下划线):存储先前的输出,就像Python的默认解释器一样。
  • __ (两个下划线):存储上一个先前的输出。
  • ___ (三个下划线):存储下一个先前的输出。

从IPython文档了解更多内容: 输出缓存系统.


你知道在Python中它是在哪里定义的吗?我找不到路径和文件名。 - tdolydong

6

理论上来说,这些只是普通的变量名。按照惯例,单个下划线被用作“不关心”的变量。例如,如果一个函数返回一个元组,而你只对其中一个元素感兴趣,那么在Python中忽略其他元素的方法是:

_, x = fun()

在一些解释器中,___ 有特殊含义,并存储了先前评估的值。


2
值得注意的是,这不仅仅是(或最初)“Pythonic”的。在一些不允许破坏性赋值的语言中,“_”是唯一可以重新分配但永远无法读取的变量。 - Hyperboreus
1
“不关心”的变量通常被称为洞口 - Jamie Counsell

3

在Python中,它的含义取决于你所指定的含义。下划线是一个有效的名称字符。(但是,如果你使用IPython,请参见Martin的好答案。)

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

3x!我在哪里可以找到更多相关的知识,官方文档? - Statham

2
根据这里所述,在iPython中:
  • _(一个下划线):存储先前的输出,就像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

In [1]: x = 10

In [2]: y = 4

In [3]: x + y
Out[3]: 14

In [4]: _3
Out[4]: 14

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接