python中,下划线 "_""_"" \_" 不管是单独作为变量名或者作为变量名的前缀或者后缀,是有特殊含义的,下面简要的来总结一下。

1, 单下划线 "_""_""\_"

在python3中,单下划线 "_""_""\_" 默认为空字符串变量,如下图:

一旦交互式解释器会话中上一条语句执行的结果没有通过赋值语句赋值给一个变量,则该值默认赋值给 "_""_""\_" ,如下图所示:

单下划线 "_""_""\_" 也可以作为临时变量来使用,例如,下面的例子中,你可能对循环计数中的实际值并不感兴趣,此时就可以使用 "_""_""\_" 。

n = 42
for _ in range(n): do_something()

2,作为变量前的单下划线 "_""_""\_",如_xxx

python中单下划线开头的变量,标明是一个受保护(protected)的变量,原则上不允许直接访问,但外部类还是可以访问到这个变量的。
这只是程序员之间的一个约定,用于警告说明这是一个私有变量,外部类不要去访问它。
如下所示,在Student类中定义了一个受保护变量_name,外部是可以访问到这个变量的,但是不推荐这样干。

class Student:def __init__(self, name, age):self._name = nameself.age=agestu = Student('hello',30)
print(stu.age)    #30
print(stu._name)  #hello

另外在以"_""_""\_"开头的名称都不会被“from<模块/包名>import∗”“from<模块/包名>import∗”“from import *” 这种形式导入,这种情况也适用于__xxx, __xxx__,如下所示,简单的在模块test1中定义4个模块变量,然后在模块test2中以from test1 import *形式导入。

模块test1.py:

'''模块test1.py'''
'''定义4个模块变量'''
num = 20
_num = 90
__num = 900
__num__ = 10

模块test2.py:

'''模块test2.py'''
from test1 import *print(num) #输出20
print(_num) #报错,name '_num' is not defined
print(__num) #报错,name '__num' is not defined
print(__num__) #报错,name '__num__' is not defined

如果是import test1的形式导入是没问题的:

模块test2.py:

'''模块test2.py'''
import test1print(test1.num) #输出20
print(test1._num) #输出90
print(test1.__num) #输出900
print(test1.__num__) #输出10

3,作为变量前的双下划线 "__""__""\_\_",如__xxx

在Python中,实例的变量名如果以__开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问,因为Python解释器对外把 __xxx变量改成了_classname__xxx,所以,仍然可以通过_classname__xxx来访问__xxx变量:所以,我们把test1.py中的Student类改一改:

class Student:def __init__(self, name, age):self.__name = nameself.age=agestu = Student('hello',30)
print(stu.age) #输出30
print(stu.__name) #报错:AttributeError: 'Student' object has no attribute '__name'
print(stu._Student__name) #输出hello

4,变量前后的双下划线 如__xxx__

这种用法表示Python中特殊的方法名。其实,这只是一种惯例,对Python系统来说,这将确保不会与用户自定义的名称冲突。通常,你将会 覆写这些方法,并在里面实现你所需要的功能,以便Python调用它们。例如,当定义一个类时,你经常会覆写“__init__”方法。

双下划线开头双下划线结尾的是一些 Python 的“魔术”对象,如类成员的 __init__、__del__、__add__、__getitem__ 等,以及全局的 __file__、__name__ 等。 Python 官方推荐永远不要将这样的命名方式应用于自己的变量或函数,而是按照文档说明来使用。 虽然你也可以编写自己的特殊方法名,但不要这样做。


5,题外话 if __name__ == “__main__”:

经常在一些python程序中看见这样的写法。

因为所有的 Python 模块都是对象并且有几个有用的属性,你可以使用这些属性方便利的测试你所书写的模块。

模块是对象, 并且所有的模块都有一个内置属性 __name__。一个模块的 __name__ 的值要看您如何应用模块。如果 import 模块, 那么__name__的值通常为模块的文件名, 不带路径或者文件扩展名。但是您也可以像一个标准的程序一样直接运行模块, 在这种情况下__name__的值将是一个特别的缺省值:__main__。


6,总结:

需要注意的是,在Python中,变量名类似__xxx__的,也就是以双下划线开头,并且以双下划线结尾的,是特殊变量,特殊变量是可以直接访问的,不是private变量,所以,不能用__name____age__这样的变量名。

有些时候,你会看到以一个下划线开头的实例变量名,比如_name,这样的实例变量外部是可以访问的,但是,按照约定俗成的规定,当你看到这样的变量时,意思就是,“虽然我可以被访问,但是,请把我视为私有变量,不要随意访问”。

双下划线开头的实例变量是不是一定不能从外部访问呢?其实也不是。不能直接访问__xxx是因为Python解释器对外把__xxx变量改成了_classname__xxx,所以,仍然可以通过_classname__xxx来访问__xxx变量。



参考

  1. https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014318650247930b1b21d7d3c64fe38c4b5a80d4469ad7000
  2. https://blog.csdn.net/youngbit007/article/details/61616241
  3. http://python.jobbole.com/81129/?utm_source=blog.jobbole.com&utm_medium=relatedPosts
  4. https://www.cnblogs.com/MUMO/p/5718578.html

python中的下划线_讲解相关推荐

  1. Python中单个下划线“_”变量的目的是什么?

    在Python中,下划线_被视为" 我不关心 "或" 丢失 "变量 python解释器将最后一个表达式值存储到名为的特殊变量中_. >>> 1 ...

  2. Python中单个下划线“ _”变量的用途是什么?

    这段代码中_ after for的含义是什么? if tbh.bag:n = 0for _ in tbh.bag.atom_set():n += 1 #1楼 下划线_在Python中被视为" ...

  3. Python中带下划线_的变量和函数命名的用法

    Python 的代码风格由 PEP 8 描述.这个文档描述了 Python 编程风格的方方面面.在遵守这个文档的条件下,不同程序员编写的 Python 代码可以保持最大程度的相似风格.这样就易于阅读, ...

  4. python中不被定义_一日一技:在Python中双下划线私有方法不能被调用的原理

    一日一技:在Python中双下划线私有方法不能被调用的原理 在使用Python编写面向对象的代码时,我们会常常使用"继承"这种开发方式.例如下面这一段代码: class Info: ...

  5. python怎么打下划线符号_详解 Python 中的下划线命名规则

    在 python 中,下划线命名规则往往令初学者相当 疑惑:单下划线.双下划线.双下划线还分前后--那它们的作用与使用场景 到底有何区别呢?今天 就来聊聊这个话题. 1.单下划线(_) 通常情况下,单 ...

  6. python中的for in循环有什么意思_for _ in xxx中的下划线_是什么意思?

    for _ in list中的下划线_只是一个临时的循环变量, 因为_是合法的变量名 for _ in [1, 2, 3]:print(_) li = [[0, 1] for _ in range(3 ...

  7. python变量必须以字母和下划线_【转载】关于python中带下划线的变量和函数的意义...

    Python 的代码风格由 PEP 8 描述.这个文档描述了 Python 编程风格的方方面面.在遵守这个文档的条件下,不同程序员编写的 Python 代码可以保持最大程度的相似风格.这样就易于阅读, ...

  8. Swift实战问题之Swift 中的下划线_是什么意思?

    实战问题 Swift 中的下划线_是什么意思?例如下面的函数参数 for _ in 1-5 { print("hello") } if let _ = optionalValue ...

  9. python中__init__下划线怎么打出来___init__()-------“_”下划线开头的函数

    1.linux kernel中双下划线开头的函数 常常, 当你查看内核 API 时, 你会遇到以双下划线(__)开始的函数名. 这样标志的函数名通常是一个低层的接口组件, 应当小心使用. 本质上讲, ...

最新文章

  1. 《资本说》如何帮助企业从“0”到“1”,看王波玩转投资攻略
  2. android碎片按钮,Android 碎片(Fragment)
  3. Array Splitting
  4. 易语言 取自定义数据类型的大小
  5. servlet ehcache beanfactroy c3p0 配置文件
  6. 说透Applet的数字签名之2——数字签名
  7. 一个核心系统 3 万多行代码的重构之旅
  8. Apache Kafka简介与安装(一)
  9. vb 连接 mysql数据库代码_vb连接access数据库方法和代码
  10. M1 Repast Simphony打不开 无反应问题解决
  11. 【GPU精粹与Shader编程】(六) 《GPU Gems 3》:真实感皮肤渲染技术总结
  12. 互联网流量的本质是什么?
  13. 长方形的周长公式的c语言,长方形周长公式
  14. js 格式化金额方法
  15. (轉貼) 馬英九特別費案起訴書全文 (News)
  16. 技术方案评审文档模版
  17. 京东JD App签名/加密算法研究
  18. matlab抽样仿真混叠图,数字信号处理及MATLAB仿真__前言
  19. docker安装mysql遇到的问题
  20. 基于ImagePy工具的岩块图像二值化分割研究

热门文章

  1. 大鹏教你数据分析系列--运动员身材都是完美的吗
  2. 数字后端面试100问(校招版)
  3. Memory Compiler
  4. 计算机网络CPT简单应用
  5. objective-c常见类型%z
  6. 离散数学计算机专业论文,计算机与离散数学论文.doc
  7. 社会综合治理智慧综治管理系统平台Java商业源码
  8. 2019校招面经大汇总
  9. 19 个接私活平台,有技术就有钱
  10. 如何区分网线是几类的_怎么能从网线上看出网线是几类线~请高手帮帮忙~先谢谢了...