在 Python 中,变量名前使用单下划线(_)和双下划线(__)有不同的含义和用途。以下是它们的区别和具体用法:
1. 单下划线 (_)
1.1 作为临时变量
单下划线通常用作临时变量,表示该变量不会被使用。
示例:
for _ in range(5):
print("Hello") # 不需要使用循环变量
1.2 作为模块中的私有变量
在模块中,单下划线前缀的变量或函数表示“内部使用”,是一种约定俗成的私有标识符。
注意:这只是一个约定,Python 并不会真正限制访问。
示例:
# module.py
_private_var = 10 # 表示内部使用
def _private_function():
return "This is private"
1.3 在交互式解释器中
在 Python 交互式解释器中,单下划线表示上一个表达式的结果。
示例:
>>> 10 + 20
30
>>> _ + 5 # _ 表示上一个结果 30
35
2. 双下划线 (__)
2.1 名称修饰(Name Mangling)
双下划线前缀的变量或方法会被 Python 解释器重命名,以避免子类与父类的命名冲突。
重命名规则:_类名__变量名。
示例:
class MyClass:
def __init__(self):
self.__private_var = 42 # 会被重命名为 _MyClass__private_var
obj = MyClass()
print(obj.__dict__) # 输出:{'_MyClass__private_var': 42}
2.2 访问双下划线变量
虽然双下划线变量被重命名,但仍可以通过重命名后的名称访问。
示例:
print(obj._MyClass__private_var) # 输出:42
2.3 双下划线方法(魔术方法)
双下划线包围的方法(如 init、str)是 Python 的魔术方法,用于实现类的特殊行为。
示例:
class MyClass:
def __init__(self, value):
self.value = value
def __str__(self):
return f"MyClass with value: {self.value}"
obj = MyClass(10)
print(obj) # 输出:MyClass with value: 10
3. 单下划线和双下划线的对比
特性 | 单下划线 (_) | 双下划线 (__) |
---|---|---|
含义 | 约定俗成的私有标识符 | 名称修饰,避免子类命名冲突 |
访问限制 | 无实际限制,仅约定 | 通过名称修饰限制访问 |
重命名 | 无 | 重命名为 _类名__变量名 |
常见用途 | 临时变量、模块私有变量 | 类的私有变量、魔术方法 |
4. 示例代码
单下划线示例
# 模块中的私有变量
_private_var = 10
def _private_function():
return "This is private"
# 临时变量
for _ in range(3):
print("Hello")
双下划线示例
class MyClass:
def __init__(self):
self.__private_var = 42 # 名称修饰为 _MyClass__private_var
def __str__(self):
return f"MyClass with value: {self.__private_var}"
obj = MyClass()
print(obj) # 输出:MyClass with value: 42
print(obj._MyClass__private_var) # 输出:42
5. 总结
单下划线 (_):
- 表示临时变量或模块私有变量。
- 是一种约定,无实际访问限制。
双下划线 (__):
-
用于名称修饰,避免子类命名冲突。
-
通过重命名限制访问,但仍可间接访问。
-
双下划线包围的方法是魔术方法,用于实现类的特殊行为。