var*_*ble 8 python python-internals
例如,是否将字符串var1 = 'ROB'
存储为3个存储位置R,O和B,每个存储位置都有其自己的地址,并且变量var1
指向存储位置R?那么它如何指向O和B?
以及其他字符串(例如:)是否var2 = 'BOB'
指向内存中所var1
引用的相同的B和O ?
字符串的存储方式是实现细节,但实际上,在CPython参考解释器上,它们以C样式的字符数组存储。因此,如果R
at在address x
,则O
在at x+1
(或+2
or +4
,取决于字符串中的最大序数值),并且B
在at上x+2
(or +4
or +8
)。由于字母是连续存储的,因此知道在哪里R
(以及其中的一个标志str
,表示每个字符的存储空间有多大)就足以定位O
和B
。
'BOB'
位于完全不同的地址,y
并且其O
和B
也都是连续的。该OB
中'ROB'
是完全无关的OB
的'BOB'
。
这有一个令人困惑的方面。如果您在字符串中建立索引,然后检查id
结果,则看起来'O'
两个字符串中的地址相同。但这仅仅是因为:
'O'
是单例(无论如何创建,都将取回缓存的字符串)我会注意到,str
现代Python中的实际内部结构比上面介绍的还要复杂。单个字符串最多可以在同一对象中以三种不同的编码存储相同的数据(规范格式和用于特定Python C API的缓存版本)。除了检查大小之外,它在Python级别上是不可见的sys.getsizeof
,因此通常不值得担心。
如果您真的想摆脱杂草,请随时阅读PEP 393:“灵活的字符串表示形式”,它详细介绍了str
CPython 3.3中采用的新对象结构的内部。