下划线常见用法

形式 名称 常见用途 示例
_ 单下划线 临时变量 / 忽略值 / 上一次结果 _ = 5for _ in range(3)
_var 单前导下划线 弱“内部使用”标识(受保护属性) _helper()
__var 双前导下划线 名称改写(Name Mangling),避免子类冲突 self.__count
var_ 单尾下划线 避免与关键字冲突 class_ = "MyClass"
__var__ 双前后下划线 Python 特殊方法或魔术方法(magic methods) __init__, __len__

下划线详细讲解

_ 单下划线

📌 含义 1:忽略的变量(占位符)

当变量值不重要时,使用 _ 表示“我不关心这个值”:

1
2
for _ in range(5):
print("Hello")

表示循环 5 次,但不关心循环变量。

再比如:

1
x, _, y = (1, 2, 3)

忽略中间的值。

📌 含义 2:交互式解释器中上一个结果

在 Python REPL(交互模式)中,_ 保存上一次表达式的结果

1
2
3
4
5
6
>>> 3 + 4
7
>>> _
7
>>> _ * 2
14

📌 含义 3:国际化(在某些框架中)

在 Django、Flask 等中,_ 常被用作翻译函数的别名:

1
2
from gettext import gettext as _
print(_("你好,世界"))

_var 单前导下划线

表示“内部使用”,不建议外部直接访问。

在 Python 中这是一种 命名约定(convention),并不会强制限制访问,但在使用 from module import * 时,它会被忽略。

1
2
3
# module.py
_internal_value = 42
public_value = 100
1
2
3
from module import *
print(public_value) # ✅ 正常
print(_internal_value) # ❌ 不会被导入

同时在类中:

1
2
3
class MyClass:
def _helper(self):
print("内部方法")

调用时建议只在类内部用,不是强制隐藏。

__var 双前导下划线

📌 用于避免子类命名冲突

Python 会自动改写这种属性的名字,加上类名作为前缀:

1
2
3
4
5
6
7
class A:
def __init__(self):
self.__data = 123

a = A()
print(a.__data) # ❌ AttributeError
print(a._A__data) # ✅ 123

这种机制叫 Name Mangling(名称改写),主要用于继承时防止变量被子类覆盖。

实例:避免冲突

1
2
3
4
5
6
7
8
class Base:
def __init__(self):
self.__count = 0

class Sub(Base):
def __init__(self):
super().__init__()
self.__count = 100 # 实际是 self._Sub__count,与 _Base__count 不冲突

var_ 单尾下划线

当变量名与 Python 关键字或内置函数冲突时,用下划线结尾。

1
2
class_ = "MyClass"
list_ = [1, 2, 3]

例如不能写:

1
class = "MyClass"  # ❌ SyntaxError

__var__ 双前后下划线

Python 内部保留的命名约定,用于 特殊方法(magic methods)系统钩子(hooks)

例如:

方法 作用
__init__ 构造函数
__str__ 转为字符串时调用
__len__ 调用 len(obj) 时触发
__iter__ 可迭代对象
__call__ 对象可被调用

这些方法是 Python 内部协议的一部分,不要随意自定义以 __xxx__ 命名的变量。

下划线总结对比表

形式 含义 使用场景 是否受保护
_ 忽略值 / 上次结果 / 翻译函数 临时变量、循环、REPL
_var 模块或类内部使用 内部函数、内部变量 弱“私有”
__var 名称改写(防冲突) 类属性、继承安全 是(改名)
var_ 避免与关键字冲突 关键字冲突
__var__ Python 内部保留名称 魔术方法 系统保留

下划线实践建议

✅ 建议:

  • 使用 _ 表示无关变量。
  • 使用 _var 表示内部变量(弱保护)。
  • 使用 __var 仅在继承中需要防冲突时。
  • 使用 var_ 避免关键字冲突。
  • 不要自己定义 __var__ 除非遵守 Python 协议(如 __init____str__)。

❌ 不建议:

  • 滥用双下划线隐藏变量(调试不方便)。
  • 伪造系统方法名(如自定义 __update__)。