_用于临时变量

_可以作为一个临时变量,用来接收各种没什么用的变量,这种用法多见于各种生成器产生数据时,有的时候生成器返回的数据我们只需要用到其中的部分变量,那么那些没有用到同时在赋值时不能缺少的变量就可以用_接收,除此以外,单下划线在python中会默认与上一次运算过程中的非None结果保存下来(注意赋值语句相当于None,与C语言区分开),有点类似于计算器的ans功能:

>>> 2+2
4
>>> a=1
>>> _
4
>>> for i,_ in [["xiaoming",172],["xiaowang",160]]:
... print(i)
...
xiaoming
xiaowang

除此以外_还用于长数字的分割,这在数字本身较长时比较常见:

>>> a = 9_999_999_999
>>> a
9999999999

var_解决命名冲突问题

编程过程中如果声明的变量是python的保留字的话,这个时候如果想要使用该保留字作为变量名称,则可以加一个_,如创建一个变量class_

_var用于保护变量

保护变量是指那些程序员约定俗成的,作为调用细节不需要操作者关心的一些变量,这些变量python的解释器不做访问限制,但是因为这些变量的缺失并不会对我们调用函数带来什么困难,如果直接导入还存在干扰我们的命名空间的可能,因此在使用类似于from XXX import *这种导入形式时,这类变量并不会被导入,但是依旧可以通过在源模块的访问方式中进行访问(保护变量不做访问限制)。

当然,python社区并不希望我们使用from XXX import *这种通配导入的方法,因为这样的导入很容易影响到我们的命名空间(尽管去除了保护变量)

一般来说,突破保护属性的方法有两种:

  • 一种是将保护属性加入到all列表(__all__=[_var])中,接着我们就可以使用from XXX import *导入在列表中的保护属性。
  • 另外一种方法是在导入时直接声明要导入的保护变量的名称
  • 甚至可以通过import XXX的方式进行导入

__var用于私有变量

与保护变量类似,私有变量属于保护更大一些,私有变量通过解释器层面的改写机制(name mangling)实现了私有变量的保护。

当然这种改写机制也并非真正含义上的私有,python中不存在绝对私有的变量,只是通过这种改写方式告诉我们,这段程序的主人不希望我们变动私有属性的值。

__var__用于魔术方法

魔术方法一般是给系统调用用的,可以理解为一种通用方法,因为十分通用,所以直接以这种形式固定了下来

参开文献