var*_*ble 8 python python-internals
例如,是否将字符串var1 = 'ROB'存储为3个存储位置R,O和B,每个存储位置都有其自己的地址,并且变量var1指向存储位置R?那么它如何指向O和B?
以及其他字符串(例如:)是否var2 = 'BOB'指向内存中所var1引用的相同的B和O ?
字符串的存储方式是实现细节,但实际上,在CPython参考解释器上,它们以C样式的字符数组存储。因此,如果Rat在address x,则O在at x+1(或+2or +4,取决于字符串中的最大序数值),并且B在at上x+2(or +4or +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:“灵活的字符串表示形式”,它详细介绍了strCPython 3.3中采用的新对象结构的内部。
| 归档时间: |
|
| 查看次数: |
167 次 |
| 最近记录: |