Python中的标识符与保留字
一、前言
你是否曾因变量名写错而调试半小时?
是否好奇为什么 class、def 不能当变量名?
又或者看到别人写的 user_name、MAX_RETRY 感到困惑?
这些问题的答案,都藏在 Python 的两个基础概念中:标识符(Identifier) 与 保留字(Reserved Words / Keywords)。
本文将带你: ✅ 掌握标识符的命名规则与最佳实践
✅ 了解 Python 所有保留字及其用途
✅ 避免常见命名错误(如覆盖内置函数)
✅ 写出符合 PEP8 规范的专业代码
二、什么是标识符?
标识符(Identifier) 是你在程序中用来命名变量、函数、类、模块等的“名字”。
例如:
name = "Alice" # 变量名:name
def calculate_sum(): # 函数名:calculate_sumpassclass Student: # 类名:Studentpass这些 name、calculate_sum、Student 都是标识符。
三、Python 标识符的命名规则
✅ 合法标识符必须满足:
- 只能包含:字母(a–z, A–Z)、数字(0–9)、下划线
_ - 不能以数字开头
- 区分大小写:
Name和name是两个不同标识符 - 不能是保留字(关键字)
✅ 合法示例:
user_name
_total_count
PI
get_data
MyClass❌ 非法示例:
2nd_place # 以数字开头 ❌
my-variable # 包含连字符 ❌
class # 是保留字 ❌
@var # 包含特殊符号 ❌💡 小技巧:不确定是否合法?用
str.isidentifier()判断:
print("user_name".isidentifier()) # True
print("2nd".isidentifier()) # False
print("class".isidentifier()) # True(语法上合法,但它是关键字,不能用!)四、Python 保留字(Keywords)详解
保留字是 Python 语言预定义的、具有特殊含义的单词,不能用作标识符。
截至 Python 3.12,共有 35 个保留字。你可以通过以下方式查看:
import keyword
print(keyword.kwlist)输出:
['False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await',
'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except',
'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is',
'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return',
'try', 'while', 'with', 'yield']常见保留字分类速览:
| 类别 | 保留字 |
|---|---|
| 控制流 | if, elif, else, for, while, break, continue |
| 函数/类定义 | def, class, return, yield |
| 异常处理 | try, except, finally, raise, assert |
| 逻辑运算 | and, or, not, is, in |
| 作用域 | global, nonlocal |
| 异步编程 | async, await |
| 常量 | True, False, None |
| 其他 | import, from, as, with, pass, del, lambda |
⚠️ 注意:
True、False、None虽然是常量,但也是保留字,不能赋值:
True = 1 # SyntaxError!五、命名规范:不只是“能用”,更要“好用”
即使标识符合法,乱命名也会让代码难以维护。Python 官方推荐遵循 PEP8 风格指南。
📌 推荐命名风格:
| 对象类型 | 命名风格 | 示例 |
|---|---|---|
| 变量、函数、方法 | snake_case(小写+下划线) | user_id, get_user_info |
| 类名 | PascalCase(大驼峰) | UserProfile, DatabaseConnection |
| 常量(模块级) | UPPER_SNAKE_CASE | MAX_CONNECTIONS, DEFAULT_TIMEOUT |
| 私有成员(约定) | 单下划线开头 | _internal_helper |
| 强私有(名称修饰) | 双下划线开头 | __secret_data |
✅ 正确示例:
MAX_RETRY_COUNT = 3class UserManager:def __init__(self):self._users = []def add_new_user(self, user_name):if not user_name:raise ValueError("User name cannot be empty")self._users.append(user_name)❌ 反面教材:
maxRetryCount = 3 # 混合风格,不符合 Python 习惯
class usermanager: # 类名应大写
def AddUser(): # 函数名不应大写开头pass六、常见陷阱与避坑指南
❌ 陷阱 1:覆盖内置函数或类型
list = [1, 2, 3] # 覆盖了内置 list()
print(list("abc")) # TypeError: 'list' object is not callable✅ 解决方案:避免使用内置名称(如 list, str, int, dict, open, id 等)
🔍 查看所有内置名称:
import builtins
print(dir(builtins))❌ 陷阱 2:使用中文或拼音命名(虽合法但不推荐)
用户名 = "张三" # 合法,但不利于协作和国际化
def 获取数据(): # 同上pass✅ 建议:始终使用英文命名,哪怕简单如 user, data, result
❌ 陷阱 3:单字符命名(除非在极小作用域)
for i in range(10): # 可接受(传统循环变量)passdef f(x): # 不推荐!x 是什么?return x * 2✅ 改进:
def double_number(value):return value * 2七、工具辅助:让命名更规范
- IDE 提示:VS Code / PyCharm 会高亮保留字,并提示命名风格问题
- 静态检查工具:
flake8:检查 PEP8 合规性pylint:检测命名、未使用变量等
- 命名插件:如 VS Code 的 “Python Docstring Generator” 可自动生成规范注释
八、总结
| 概念 | 关键点 |
|---|---|
| 标识符 | 用于命名变量、函数、类等,需符合命名规则 |
| 保留字 | 35 个关键字,具有特殊语法意义,禁止用作标识符 |
| 命名规范 | 遵循 PEP8:snake_case、PascalCase、UPPER_SNAKE_CASE |
| 避坑原则 | 不覆盖内置、不用拼音、不用模糊缩写 |
🌟 记住:
好的命名,是代码最好的注释。
一个清晰的user_email,胜过十行解释!
九、结语
感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!
