Python哪些词不能做变量名?保留字清单与查看方法

Alice
Alice
发布时间:2026-11-02 | 5人浏览过
原创

全面解析Python中不能作为变量名的保留字清单、标识符命名合法性规则、交互式与代码查看方法,以及避免覆盖内置函数的工程最佳实践。

在 Python 编程中,不能作为变量名的词汇主要由 35 个语法保留字(Keywords)构成。这些词被解释器用于语法解析与控制流逻辑,直接为其赋值会触发 SyntaxError: invalid syntax 错误。此外,不符合标识符格式规范的词(如数字开头、含连字符或空格)同样被编译器强制禁止。本文将完整列出当前主流 Python 版本的保留字清单、演示标准库的动态查看方法,并深入解析容易引发逻辑灾难的“内置函数遮蔽”陷阱与规避策略。

一、Python 变量命名的语法红线与分类

Python 解释器在对源码进行词法分析(Lexical Analysis)时,会将代码拆解为一系列符号(Tokens)。变量名属于“标识符”(Identifiers)的一种。为了保证语法解析树的唯一性与确定性,Python 在语言设计之初就确立了严格的命名边界。

一个变量名能否正常定义,取决于它是否通过三道检验关卡:

  • 语法保留字排查:绝对禁止使用语言关键字(如 if、for、class、def)。解释器将这些词保留为专用语法结构,无论在模块顶层、函数内部还是类作用域中,均不可覆写。
  • 标识符规则检验:变量名必须由 Unicode 字母(通常为英文字母)、数字以及下划线 _ 组成,且首字符严禁为数字,中间不能包含空格、连字符 -、点号 . 或 @、$、% 等特殊操作符。
  • 内置命名空间规避:诸如 list、str、id、type、sum 等属于 builtins 模块预定义的内置对象。虽然语法上允许重新赋值,但会发生命名遮蔽(Shadowing),导致后续无法正常调用同名内置功能。
Python哪些词不能做变量名?保留字清单与查看方法
图1:Python 变量命名合法性排查与决策流程图。清晰展示了保留字语法拦截与内置名称遮蔽的不同阶段。

二、Python 完整保留字清单与分类解析

在主流的 Python 3.10 至 3.12 版本中,解释器内置了 35 个保留字。所有保留字全部为英文小写,仅有 3 个首字母大写的特殊保留字:False、None 和 True。

为了便于系统化记忆与掌握,我们可以将这 35 个保留字按照其在程序控制流与结构中的职责划分为六大核心模块:

Python哪些词不能做变量名?保留字清单与查看方法
图2:Python 3.x 核心保留字架构全景图。将 35 个保留字按语法功能划分为六大分类,便于直观识别。

35 个保留字对照速查表

分类领域 保留字列表 典型语法用途与错误赋值示例
逻辑与布尔 False, None, True, and, or, not 逻辑判定与原生单例。True = 1 报错:cannot assign to True。
流程与跳转 if, elif, else, for, while, break, continue 构建控制分支与循环体。for = "loop" 报 SyntaxError。
函数与对象 def, class, return, lambda, yield 子程序及面向对象结构声明。class = "Grade1" 报语法错误。
异常控制 try, except, finally, raise, assert 错误处理机制。except = "Timeout" 属于非法声明。
命名空间 import, from, as, global, nonlocal 模块载入及跨作用域修改声明。as = 10 语法不合法。
异步与上下文 async, await, with, pass, del, in, is 协程驱动、资源管理及成员身份操作符。in = [1, 2] 报语法错误。

三、如何在本地查看当前 Python 版本的保留字

不同 Python 版本之间可能会微调保留字(例如 Python 3.7 固化了 async 和 await,去除了早期 Python 2 的 print 和 exec 关键字)。掌握在当前运行环境中动态提取保留字的方法,是编写跨版本可靠代码的重要技能。

Python哪些词不能做变量名?保留字清单与查看方法
图3:通过 Python 标准库 keyword 模块查看清单与动态判定的完整执行步骤。

方法 1:使用标准库 keyword.kwlist 打印完整清单

Python 官方标准库自带名为 keyword 的轻量模块,其中的 kwlist 属性是一个包含所有当前保留字的字符串列表。

执行代码:

import keyword

# 获取并打印当前 Python 解释器的所有保留字
print("当前版本保留字列表:")
print(keyword.kwlist)

# 打印保留字总数
print(f"保留字总计:{len(keyword.kwlist)} 个")

示例输出(Python 3.11 环境):

当前版本保留字列表:
['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']
保留字总计:35 个

方法 2:使用 keyword.iskeyword() 进行程序化检测

在处理数据反序列化(例如从外部字典或数据库表字段生成类属性)时,通常需要使用程序自动判断某个字符串是否为保留字。直接调用 keyword.iskeyword(s) 即可返回布尔值。

执行代码:

import keyword

candidates = ["class", "user_id", "def", "normal_var", "yield", "type"]

for name in candidates:
    if keyword.iskeyword(name):
        print(f"[{name}] 是保留字,不可用作变量名")
    else:
        print(f"[{name}] 不是保留字,语法层面允许定义")

示例输出:

[class] 是保留字,不可用作变量名
[user_id] 不是保留字,语法层面允许定义
[def] 是保留字,不可用作变量名
[normal_var] 不是保留字,语法层面允许定义
[yield] 是保留字,不可用作变量名
[type] 不是保留字,语法层面允许定义

方法 3:在终端交互式解释器中使用 help("keywords")

如果不希望编写脚本,仅需临时在终端查看说明,可直接进入 Python REPL 执行内置帮助函数:

>>> help("keywords")

Here is a list of the Python keywords.  Enter any keyword to get more help.

False               class               from                or
None                continue            global              pass
True                def                 if                  raise
and                 del                 import              return
as                  elif                in                  try
assert              else                is                  while
async               except              lambda              with
await               finally             nonlocal            yield
break               for                 not

四、避坑指南:保留字 vs 内置名称遮蔽(Shadowing)

许多初学者常犯的一个严重错误,是将“不会报语法错误的词”默认当成“可以安全使用的变量名”。在 Python 中,语法保留字(Keywords)与内置标识符(Built-ins)有着截然不同的生命周期与解析层级。

Python哪些词不能做变量名?保留字清单与查看方法
图4:语法保留字与内置标识符的本质差异对比与工程规避准则。

典型遮蔽灾难:为什么严禁使用 list / str / sum 作为变量名?

Python 根据 LEGB 规则(Local -> Enclosing -> Global -> Built-in)依次检索变量。如果我们在全局或局部命名空间中定义了一个名为 list 的变量:

# 错误示例:将变量命名为内置类型 list
list = [10, 20, 30]

# 后续代码试图调用系统的 list() 转换函数
new_items = list(range(5))

此时解释器在当前作用域中找到了变量 list,其类型是已经赋值的列表对象。当尝试对其进行括号调用时,解释器立即抛出致命异常:

TypeError: 'list' object is not callable

这种错误往往不在声明变量时爆发,而是在几十行甚至引用该模块的第三方代码中突然抛出,极难排查。同理,str、id、max、min、open、sum 均不可作为自定义变量名。

工程重命名技巧(PEP 8 推荐规范)

当我们在对接第三方 API 或面向对象属性建模时,常常遇到参数名恰好是保留字的情况(如 HTML 标签的 class、数据模型的 type、循环的 in)。

官方 PEP 8 规范推荐的唯一标准解决方案是:在变量名尾部追加单个下划线,例如:

  • class_ = "btn btn-primary"(避免与 class 冲突)
  • type_ = "student"(避免与内置函数 type() 发生冲突与遮蔽)
  • in_ = "incoming"(避免与成员操作符 in 冲突)

五、全文要点总结

理解 Python 的受限变量名规则,是保障代码健壮性与可读性的第一道安全关卡:

  1. 绝对禁止的保留字:Python 3.x 包含 35 个语法保留字(如 if、def、class、True 等)。对保留字赋值将直接引发 SyntaxError 语法错误。
  2. 必须遵守的标识符规范:变量名首字符只能是英文字母或下划线,禁止数字开头;主体只允许字母、数字和下划线,严禁包含空格与连字符。
  3. 动态查看与判定工具:引入标准库 keyword,通过 keyword.kwlist 获取完整清单,通过 keyword.iskeyword(name) 执行自动化逻辑验证。
  4. 严加防范的内置遮蔽:绝不使用 list、str、id、sum 等内置函数名作为变量;如遇语义冲突,统一在变量末尾追加单下划线(如 class_)。
相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表