目录
  • 引言
  • 1 Unicode
  • 2 Python中的Unicode
    • 2.1 Unicode对象的好处
    • 2.2 Python对Unicode的优化
  • 3 Unicode对象的底层结构体
    • 3.1 PyASCIIObject
    • 3.2 PyCompactUnicodeObject
    • 3.3 PyUnicodeObject
    • 3.4 示例
  • 4 interned机制
    • 5 总结

      引言

      “深入认识Python内建类型”这部分的内容会从源码角度为大家介绍Python中各种常用的内建类型。

      在介绍常用类型str之前,在上一篇博客:Python源码学习笔记:深入认识Python内建类型——bytes已经为大家介绍了和str息息相关的bytes的源码知识。这篇博客回味大家分析str相关的源码。

      1 Unicode

      计算机存储的基本单位是字节,由8个比特位组成。由于英文只由26个字母加若干符号组成,因此英文字符可以直接用字节来保存。但是其他语言(例如中日韩等),由于字符众多,不得不使用多个字节来进行编码。

      随着计算机技术的传播,非拉丁文字符编码技术不断发展,但是仍然存在两个比较大的局限性:

      • 不支持多语言:一种语言的编码方案不能用于另外一种语言
      • 没有统一标准:例如中文就有GBK、GB2312、GB18030等多种编码标准

      由于编码方式不统一,开发人员就需要在不同编码之间来回转换,不可避免地会出现很多错误。为了解决这类不统一问题,Unicode标准被提出了。Unicode对世界上大部分文字系统进行整理、编码,让计算机可以用统一的方式处理文本。Unicode目前已经收录了超过14万个字符,天然地支持多语言。(Unicode的uni就是“统一”的词根)

      2 Python中的Unicode

      2.1 Unicode对象的好处

      Python在3之后,str对象内部改用Unicode表示,因此在源码中成为Unicode对象。使用Unicode表示的好处是:程序核心逻辑统一使用Unicode,只需在输入、输出层进行解码、编码,可最大程度地避免各种编码问题。

      图示如下:

      Python内建类型str源码学习

      2.2 Python对Unicode的优化

      问题:由于Unicode收录字符已经超过14万个,每个字符至少需要4个字节来保存(这里应该是因为2个字节不够,所以才用4个字节,一般不会使用3个字节)。而英文字符用ASCII码表示仅需要1个字节,使用Unicode反而会使频繁使用的英文字符的开销变为原来的4倍。

      首先我们来看一下Python中不同形式的str对象的大小差异:

      >>> sys.getsizeof('ab') - sys.getsizeof('a')
      1
      >>> sys.getsizeof('一二') - sys.getsizeof('一')
      2
      >>> sys.getsizeof('

      声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。