☰
Python基础:标识符的定义规则与使用注意事项
2026/10/13 7:41:57 网站建设 项目流程

Python基础:标识符的定义规则与使用注意事项

一、开篇:标识符——你给代码取的所有名字

在上一篇文章中,我们学习了Python的35个关键字——那些被Python保留的、有特殊含义的单词。今天我们要聊的标识符(Identifier),正好是关键字之外的另一面:你自己给代码元素取的名字。

📝 变量名、函数名、类名、模块名、参数名——这些都是标识符。你写的每一行代码几乎都包含标识符。理解标识符的规则,对于写出正确、可读、专业的Python代码至关重要。

二、什么是标识符

2.1 定义

标识符就是程序员为代码中的各种元素(变量、函数、类、模块等)自定义的名称。标识符的作用是标识——用名字来区分和引用代码中的不同实体。

# 这些"名字"都是标识符student_name='小明'# 变量名(标识符)defcalculate_average():# 函数名(标识符)total_score=0# 变量名(标识符)forscoreinscores:# 变量名(标识符)total_score+=scorereturntotal_scoreclassStudentRecord:# 类名(标识符)def__init__(self,name):# 方法名 + 参数名(都是标识符)self.name=name# 属性名(标识符)

2.2 标识符 vs 关键字

最简单的区分方式:除了35个关键字,其他一切合法的名字都是标识符。

# 用程序判断一个字符串是否是合法的标识符importkeyworddefcheck_identifier(name):"""检查一个字符串是否能用作标识符"""ifkeyword.iskeyword(name):returnf'"{name}" 是关键字,不能用作标识符'elifname.isidentifier():returnf'"{name}" 是合法的标识符'else:returnf'"{name}" 不是合法的标识符'# 测试print(check_identifier('hello'))# 合法的标识符print(check_identifier('if'))# 是关键字print(check_identifier('123abc'))# 不是合法的标识符print(check_identifier('my-var'))# 不是合法的标识符

str.isidentifier()是Python内置的字符串方法,用来判断一个字符串是否可以作为合法的标识符。

三、标识符的合法性规则

3.1 三条硬性规则

规则一:第一个字符必须是字母(a-z, A-Z)或下划线(_)

# ✅ 合法的开头name='正确'# 字母开头_name='正确'# 下划线开头Name='正确'# 大写字母开头变量='正确'# Python 3支持中文变量名(但不推荐)# ❌ 非法的开头1name='错误'# 数字开头@name='错误'# 特殊符号开头-name='错误'# 连字符开头

规则二:后续字符可以是字母、数字(0-9)或下划线

# ✅ 合法的标识符student1='正确'# 字母+数字student_name='正确'# 字母+下划线+字母_file_2='正确'# 下划线+字母+下划线+数字MAX_SIZE_100='正确'# 大写字母+下划线+数字# ❌ 非法的标识符student-name='错误'# 连字符student.name='错误'# 句号student name='错误'# 空格student@home='错误'# @符号

规则三:不能是Python关键字

# ❌ 这些都是关键字,不能用作标识符if=10class='历史课'for=3True='假'# Python 3中True是关键字,不能赋值None='有值'# None也是关键字

3.2 大小写敏感

Python标识符是严格区分大小写的:

# 这是三个不同的变量!name='小明'Name='小红'NAME='小刚'print(name)# 小明print(Name)# 小红print(NAME)# 小刚# 常见的PEP 8惯例MAX_SIZE=100# 常量用全大写max_size=100# 普通变量用小写

📝 虽然 Python 允许你同时使用name、Name和NAME,但强烈不建议在一个代码文件中这样做——这极易造成混淆。大小写在Python中是用来区分不同类型的标识符的(如全大写代表常量,首字母大写代表类名),而不是用来创建相似名字的。

四、标识符的命名约定

除了硬性规则,Python社区还有一套广泛接受的约定(Conventions)。遵守这些约定能让你的代码更容易被其他Python开发者阅读。

4.1 各类标识符的命名风格

# 变量名、函数名、方法名:snake_case(蛇形命名)student_count=42defcalculate_average(scores):pass# 类名、异常名:PascalCase(帕斯卡命名)classStudentRecordManager:passclassInvalidInputError(Exception):pass# 常量:UPPER_SNAKE_CASE(大写蛇形命名)MAX_RETRY_COUNT=3DATABASE_URL='postgresql://localhost/mydb'# 模块名:简短的小写字母(可加下划线)importdata_utilsimporthttp_client# 包名:简短的小写字母(不加下划线)# 例如:mypackage, utils, models

4.2 下划线前缀的特殊含义

classMyClass:def__init__(self):self.public_attr='公共属性'# 公开访问self._internal_attr='内部属性'# _ 前缀:约定"内部使用"self.__private_attr='私有属性'# __ 前缀:名称改写defpublic_method(self):"""公开方法"""passdef_internal_method(self):"""内部方法——约定不在类外部调用"""passdef__private_method(self):"""私有方法——Python自动改写名称"""pass

💡 关于下划线约定的详细解释,可以回顾第13篇文章"命名规范与命名习惯",里面有完整的讲解。

4.3 避免使用的命名模式

# ❌ 避免用双下划线开头和结尾(保留给Python的魔术方法)# 不要自己创建类似 __name__ 这样的标识符classBadClass:def__my_custom_magic__(self):# 危险!可能在未来Python版本中变成关键字pass# ❌ 避免下划线后跟大写字母(保留给某些特定用途)_Private='虽然合法,但不推荐'# ❌ 避免单个下划线后跟数字(有些代码检查工具会警告)_1st_place='不推荐'

五、Unicode标识符

5.1 Python 3支持中文标识符

从Python 3开始,标识符完全支持Unicode字符。这意味着你可以用中文来命名变量和函数:

# Python 3支持中文标识符(但不推荐在生产代码中使用)学生姓名='小明'年龄=20def打招呼(名字):print(f'你好,{名字}!')打招呼(学生姓名)# 你好,小明!

技术上完全可行,但大多数Python项目不使用中文标识符,原因:

  • 代码可能需要在不同语言环境的系统上运行
  • 中文输入比英文慢(频繁切换输入法)
  • Python社区的传统和习惯
  • 国际化协作的障碍

5.2 Unicode标识符的规则

Python使用Unicode标准中的规则来判定哪些字符可以作为标识符。总体上:

  • 字母类字符(包括各国文字)可以作为标识符
  • 数字类字符不能作为开头
  • 连接符类字符(如下划线)可以使用
  • emoji不能作为标识符
# ✅ 合法(但不推荐)café='法语单词'naïve='分音符'γ=0.57721# 希腊字母gamma# ❌ 非法🐍='Python'# emoji不能用作标识符

⚠️ 在日常开发中,**坚持使用ASCII字符(a-z, A-Z, 0-9, _)**是最安全、最通用的做法。

六、内置标识符和内置函数名

6.1 Python的内置函数名不是关键字

这一点经常被混淆。print、len、sum、list等虽然是Python的内置函数,但它们不是关键字。这意味着你可以(虽然不应该)把它们用作变量名:

# 技术上合法,但导致内置函数无法使用print='我把print重定义了'# print('hello') # TypeError! print现在是字符串,不能调用# 恢复原来的printdelprint# 删除变量print,就恢复了对内置print的访问print('现在print又正常了')

6.2 应该避免用作标识符的内置名称

以下是常见的内置名称,虽然可以用作标识符,但建议不要这样做:

# 不要用这些内置名称作标识符# 常用函数# print, input, len, sum, max, min, abs, round# type, int, str, float, bool, list, dict, set, tuple# range, enumerate, zip, map, filter, sorted, reversed# open, file, id, dir, help, exit, quit# object, property, classmethod, staticmethod# ❌ 示例:遮盖了内置函数list=[1,2,3]# 变量名list遮盖了内置函数list()# list('hello') # TypeError! list现在是列表对象# ✅ 变通方法# 如果确实需要用这些词作变量名,在后面加下划线list_=[1,2,3]# 尾部加下划线type_='学生'# 尾部加下划线

七、标识符作用域

7.1 什么是作用域

标识符的作用域(Scope)是指"这个标识符在代码中的哪些地方是可见的"。Python有四种作用域,按从内到外的顺序,即LEGB规则:

  • Local:函数内部定义
  • Enclosing:外层函数(嵌套函数)
  • Global:模块(文件)级别
  • Built-in:Python内置
# 四层作用域示例x='全局变量'# Global作用域defouter_function():y='外层函数变量'# Enclosing作用域definner_function():z='内层函数变量'# Local作用域print(z)# 访问Localprint(y)# 访问Enclosingprint(x)# 访问Globalprint(len)# 访问Built-ininner_function()outer_function()

7.2 标识符查找顺序

当Python遇到一个标识符时,它按照LEGB的顺序查找:

  1. 先在Local作用域找
  2. 找不到就去Enclosing找
  3. 再找不到去Global找
  4. 最后去Built-in找
  5. 都找不到就报NameError

7.3 命名冲突的处理

# 局部变量会屏蔽全局变量count=100# 全局defmy_function():count=10# 局部——这个名字在函数内部"屏蔽"了全局countprint(f'内部count:{count}')my_function()# 内部count: 10print(f'全局count:{count}')# 全局count: 100

八、标识符的常见陷阱

8.1 长得像的字符

# 这些看起来一样,其实不一样!# 注意区分:# 数字 0 vs 字母 O(大写的O)# 数字 1 vs 字母 l(小写的L)vs 字母 I(大写的I)# ❌ 非常容易混淆O0='一个是字母O,一个是数字0'Il='一个是大写I,一个是小写l'

8.2 不可见字符

# 有些时候,复制粘贴代码可能会带入不可见的Unicode字符# 例如:零宽空格(U+200B)、零宽连接符(U+200C)# 如果遇到奇怪的SyntaxError,# 尝试在IDE中开启"显示不可见字符"功能

8.3 过度长的标识符

虽然Python没有明确限制标识符长度,但过长的名字不好:

# ❌ 太长了the_total_number_of_active_users_in_the_current_session=42# ✅ 合理的长度active_user_count=42session_active_users=42

💡 一个好的标识符长度通常在8-25个字符之间。太短说不清含义(如a、t),太长影响可读性。

九、实战:审核一段代码的标识符

让我们一起来审核一段代码,找出所有标识符以及其中可能存在的问题:

# 原始代码(有一些命名问题)importkeywordclassuser_manager:# 类名应该是PascalCaseMax_User_Count=100# 常量应该全大写,这个混合了def__init__(self,Name,Email,1st_login=False):# 参数Name应该是name(小写)# 参数Email应该是email(小写)# 参数1st_login不合法(数字开头)self.name=Name self.email=Email self._1st_login=FalsedefGet_Users(self):# 方法名应该是snake_case"""获取用户列表"""List=[]# 变量名遮盖了内置函数list()foriinrange(10):# 循环变量i可以接受List.append(i)returnList

修复后的代码:

importkeywordclassUserManager:# ✅ PascalCase类名MAX_USER_COUNT=100# ✅ 全大写常量def__init__(self,name,email,is_first_login=False):# ✅ snake_case参数名self.name=name self.email=email self.is_first_login=is_first_login# ✅ 避免数字开头defget_users(self):# ✅ snake_case方法名"""获取用户列表"""user_list=[]# ✅ 避免遮盖内置函数foriinrange(10):user_list.append(i)returnuser_list

十、本篇小结

✅ 标识符是你每天写代码时都在创造和使用的东西。核心收获:

  1. 三条硬性规则:字母或下划线开头、后续可用字母数字下划线、不能是关键字
  2. 大小写敏感:name、Name、NAME是三个不同的标识符
  3. 命名约定:变量/函数snake_case,类PascalCase,常量UPPER_CASE
  4. 避免遮盖内置名称:不要用list、str、print等作为标识符
  5. LEGB作用域规则:Local → Enclosing → Global → Built-in
  6. 中文标识符可行但不推荐:生产代码中请用英文命名

📝 标识符的规则很简单,但写好标识符却是区分新手和专家的关键标志。下一篇我们开始学习Python的数字类型。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询