字符串是否在内部存储为单个字符,内存中的每个字符是否由其他类似字符串共享?

var*_*ble 8 python python-internals

例如,是否将字符串var1 = 'ROB'存储为3个存储位置R,O和B,每个存储位置都有其自己的地址,并且变量var1指向存储位置R?那么它如何指向O和B?

以及其他字符串(例如:)是否var2 = 'BOB'指向内存中所var1引用的相同的B和O ?

Sha*_*ger 5

字符串的存储方式是实现细节,但实际上,在CPython参考解释器上,它们以C样式的字符数组存储。因此,如果Rat在address x,则O在at x+1(或+2or +4,取决于字符串中的最大序数值),并且B在at上x+2(or +4or +8)。由于字母是连续存储的,因此知道在哪里R(以及其中的一个标志str,表示每个字符的存储空间有多大)就足以定位OB

'BOB'位于完全不同的地址,y并且其OB也都是连续的。该OB'ROB'是完全无关的OB'BOB'

这有一个令人困惑的方面。如果您在字符串中建立索引,然后检查id结果,则看起来'O'两个字符串中的地址相同。但这仅仅是因为:

  1. 索引到字符串将返回一个字符串,该字符串与被索引的字符串无关,并且
  2. CPython缓存长度为latin-1范围内的一个字符串,因此'O'是单例(无论如何创建,都将取回缓存的字符串)

我会注意到,str现代Python中的实际内部结构比上面介绍的还要复杂。单个字符串最多可以在同一对象中以三种不同的编码存储相同的数据(规范格式和用于特定Python C API的缓存版本)。除了检查大小之外,它在Python级别上是不可见的sys.getsizeof,因此通常不值得担心。

如果您真的想摆脱杂草,请随时阅读PEP 393:“灵活的字符串表示形式”,它详细介绍了strCPython 3.3中采用的新对象结构的内部。