You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python 3中len函数异常行为:为何chr(i).upper()返回长度为2?

为什么部分字符调用upper()后返回结果的长度变为2?

这是个非常有意思的问题,核心原因和Unicode的大小写映射规则直接相关——有些字符在转换为大写时,会被映射成多个字符的组合,而非单个字符,这和buffer没有关系。

具体原因拆解

Unicode标准为了适配不同自然语言的书写规范,并非所有字符的大小写转换都是「一对一」的:

  • 比如德语中的小写字符ß(对应Unicode码点U+00DF,也就是chr(223)),它的标准大写形式是两个字符SS(符合德语的书写习惯)。当你调用'ß'.upper()时,Python会按照Unicode规则返回'SS',所以长度自然变成2。
  • 在range(500)覆盖的Unicode码点范围内,这类字符最典型的就是ß,你可以单独测试验证:
    print(len('ß'.upper()))  # 输出 2
    

你的两段代码差异解释

  1. 第一段代码:

    for i in range(500):
        if(len(chr(i).upper())==2):
            print(chr(i))
    

    这段代码会输出所有「大写转换后变为两个字符」的原字符,比如ß,因为它满足len(chr(i).upper()) == 2的条件。

  2. 第二段代码:

    for i in range(500):
        if(len(chr(i))==2):
            print(chr(i))
    

    range(500)对应的所有Unicode码点,每个码点都对应单个Unicode标量值,所以chr(i)返回的字符串长度永远是1,条件永远不成立,自然没有输出。

补充说明

Python中字符串的len()函数是按**Unicode字符(标量值)**的数量来计算的,而不是字节数。当一个字符的大小写映射规则是「多字符替换」时,转换后的字符串长度就会和原字符不同。

内容的提问来源于stack exchange,提问作者Sumanto Dinar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 18:12:54