
你有没有遇到过这种情况?
刚开始学 Python,教程里都说变量名可以用中文。你跃跃欲试,写了个 姓名 = "张三",真能跑。但同事看了直摇头,说“还是用英文吧”。
更崩溃的是:你想用 emoji 当变量名,结果报错 SyntaxError;想给变量名加个点,又不知道哪里会出问题。查了半天,越看越迷糊。
Python 3.15 更新了 Unicode 数据库到 17.0,还新增了两个方法:isxidstart() 和 isxidcontinue()。说白了,就是让你一眼判断“这个字符能不能当变量名用”。看完这篇,再也不用为变量名能不能用中文发愁了。
Python 变量名到底能干啥?先把规则搞清楚
变量名在专业里叫“标识符(identifier)”。Python 的标识符规则大致是:
开头字符:字母、下划线,或者某些 Unicode 字符
后续字符:开头字符允许的,加上数字
不能是关键字,比如 if、for、class
不能有空格、连字符、@、# 等特殊符号
这些规则你背下来也没用,因为遇到具体字符时还是拿不准。比如中文汉字能不能用?全角数字能不能用?带声调的拼音字母能不能用?emoji 能不能用?
Python 3.15 之前,新手通常用 str.isidentifier() 来试。这个方法能告诉你一个字符串能不能当变量名,但它有几个问题:
它只能判断完整字符串,不能判断单个字符
它默认按 Python 自己的标识符规则来,跟 Unicode 标准不完全一样
你想判断“某个字符能不能放在变量名开头”时,它帮不上忙
Python 3.15 新增的 isxidstart() 和 isxidcontinue() 正好补上了这个缺口。
isxidstart() 和 isxidcontinue() 到底怎么用?
这两个函数来自标准库 unicodedata,是 Python 3.15 新增的。它们按 Unicode 标准附件 #31(UAX #31)来判断字符属性。
isxidstart(chr):判断这个字符能不能作为标识符的开头。
isxidcontinue(chr):判断这个字符能不能作为标识符的后续字符。
看个最简单的例子:
import unicodedata
print(unicodedata.isxidstart('A')) # True
print(unicodedata.isxidstart('0')) # False
print(unicodedata.isxidcontinue('0')) # True
print(unicodedata.isxidstart('_')) # True
print(unicodedata.isxidstart('中')) # True
print(unicodedata.isxidstart(' ')) # False
看明白了:
A 可以开头,也可以继续
0 不能开头,但可以作为后续字符
_ 可以开头,这是 Python 的惯例
中文字符“中”可以开头,所以中文变量名在语法上是合法的
这里顺便提一句:Python 3.15 的 unicodedata 已经更新到 Unicode 17.0.0,所以这些判断是基于最新 Unicode 标准的。你可以用下面这行查看当前版本:
print(unicodedata.unidata_version) # 17.0.0
3 个实战场景,拿来就能用
场景 1:用户输入了一个名字,能不能直接当 Python 变量名?
比如你做一个小工具,让用户输入一个字段名,然后你要把它变成代码里的变量。用户可能输入空格、emoji、各种符号。你就可以用这两个函数先筛一遍:
def is_valid_identifier(name):
if not name:
return False
# 第一个字符必须能开头
if not unicodedata.isxidstart(name[0]) and name[0] != '_':
return False
# 后面的字符必须能继续
for ch in name[1:]:
if not unicodedata.isxidcontinue(ch) and ch != '_':
return False
return True
print(is_valid_identifier('用户名')) # True
print(is_valid_identifier('user_name')) # True
print(is_valid_identifier('2nd_name')) # False
print(is_valid_identifier('name@')) # False
注意上面我们额外判断了 '_',因为下划线虽然属于 Python 标识符规则的一部分,但 isxidstart() 对它返回 True,所以其实不写也可以。
场景 2:我想写中文变量名,但不知道哪些汉字合法
实际上,绝大多数常见汉字都可以当变量名。但一些特殊字符,比如全角空格、制表符、特殊符号,就不行。你可以快速测试一组字符:
chars = ['中', '文', '变', '量', '名', '1', '①', '@', ' ', ' ']
for ch in chars:
start = unicodedata.isxidstart(ch)
cont = unicodedata.isxidcontinue(ch)
print(f'{ch!r}: start={start}, continue={cont}')
运行后你会发现,中文汉字 start 和 continue 都是 True;全角数字 '1' 只能 continue,不能 start;圆圈数字 '①' 和 '@' 两个都是 False;空格和全角空格也都不能作为变量名。
场景 3:解析代码时,需要按字符判断标识符边界
比如你在写一个简单的 tokenizer,要把字符串拆成“单词”和“符号”。遇到变量名时,你总得知道变量名什么时候结束。用 isxidcontinue() 就可以边界:
def tokenize(text):
tokens = []
i = 0
while i < len(text):
ch = text[i]
if ch.isspace():
i += 1
continue
if unicodedata.isxidstart(ch) or ch == '_':
j = i + 1
while j < len(text) and (unicodedata.isxidcontinue(text[j]) or text[j] == '_'):
j += 1
tokens.append(('IDENT', text[i:j]))
i = j
else:
tokens.append(('SYM', ch))
i += 1
return tokens
print(tokenize('用户年龄 = 25'))
# [('IDENT', '用户年龄'), ('SYM', '='), ('SYM', '2'), ('SYM', '5')]
当然这个 tokenizer 没有处理数字,主要是为了演示标识符边界判断。真实项目比这复杂得多,但核心判断可以用这两个函数。
3 个新手最容易踩的坑
坑 1:isxidstart 和 str.isidentifier 不是一回事
isidentifier() 判断的是“这个字符串是不是 Python 合法的标识符”,它会考虑 Python 关键字、不允许单独使用下划线做变量名等规则。isxidstart() 只判断单个字符的 Unicode 属性。
比如:
print('class'.isidentifier()) # True
print(unicodedata.isxidstart('c')) # True
# 前者说明它是合法标识符形状,但 class 不能当变量名,因为它是关键字
所以如果你要真正判断一个字符串能不能当变量名,isidentifier() 更方便。如果你要按字符分析,isxidstart() 更合适。
坑 2:UAX #31 和 Python 实际规则不完全重合
Python 的标识符规则基于 Unicode 标准,但有自己的取舍。有些字符通过了 isxidstart(),却不一定能通过 Python 的解析器。最典型的是某些非 ASCII 空格和特殊连字符。
所以做关键校验时,最好用 isidentifier() 或者 tokenize 结果兜底。isxidstart() 更适合做“快速筛选”和“字符级分析”。
坑 3:不同 Python 版本的 Unicode 数据库版本不一样
Python 3.15 用的是 Unicode 17.0.0,而 3.13 可能是 16.0 或更早。如果某个字符在 17.0 里才被认定为标识符字符,你用 3.15 判断它是合法的,但用旧版 Python 可能就不行。
对于普通中文、英文变量名来说,这个差异基本没影响。但对于一些罕见字符、新加入 emoji 或新文字,就要注意版本差异。
总结
Python 3.15 的 unicodedata 更新到 Unicode 17.0,并新增 isxidstart() 和 isxidcontinue(),对新手来说非常友好。它把“这个字符能不能当变量名”这件小事,从“靠试、靠猜、靠查表”变成“直接问标准库”。
记住两个核心用法:
isxidstart():判断字符能不能作为变量名开头
isxidcontinue():判断字符能不能作为变量名的后续字符
大多数日常汉字、英文字母都支持,emoji、空格、特殊符号不支持
这个改进由 Unicode 标准定义,不是 Python 自己拍脑袋。等你下次再纠结“变量名到底能不能用中文”时,直接 import unicodedata 一查就知道。
以上就是“Python 3.15 这2个方法救了多少新手?再也不用为中文变量名发愁了”的详细内容,想要了解更多Python教程欢迎持续关注编程学习网。
扫码二维码 获取免费视频学习资料

- 本文固定链接: http://www.phpxs.com/post/14284/
- 转载请注明:转载必须在正文中标注并保留原文链接
- 扫码: 扫上方二维码获取免费视频资料