[Python源码剖析]字符缓冲池intern机制

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Python源码剖析]字符缓冲池intern机制相关的知识,希望对你有一定的参考价值。

static PyStringObject *characters[UCHAR_MAX + 1];
...

/* This dictionary holds all interned strings.  Note that references to
   strings in this dictionary are *not* counted in the string‘s ob_refcnt.
   When the interned string reaches a refcnt of 0 the string deallocation
   function will delete the reference from this dictionary.

   Another way to look at this is that to say that the actual reference
   count of a string is:  s->ob_refcnt + (s->ob_sstate?2:0)
*/

  Python源码[Object/stringobject.c]中UCHAR_MAX = 255.

所以Python解释器会缓冲256个字符串, 第257个字符串多次赋值不同的变量名, id()查看的结果就不同了:

>>> len(locals().keys())
4
>>> for i in range(256):
...     locals()[‘a%s‘%i]= str(i)
...
>>> len(locals().keys())
261
>>> a=‘247‘
>>> id(a247)
4301254088
>>> id(a)
4301235264
>>>

  可见intern机制可以缓存256个PyStringObject对象. 前三章看完了, 就主要两个知识点, 小整数集合范围[-5, 257), 字符缓冲池intern机制缓存256即0xff个字符串.

以上是关于[Python源码剖析]字符缓冲池intern机制的主要内容,如果未能解决你的问题,请参考以下文章

java 创建string对象机制 字符串缓冲池 字符串拼接机制

python的内存驻留机制(小数据池)

1.字符串池化(intern)机制及拓展学习

Python 源码剖析LIST对象

Python 面向对象进阶

java 创建string对象机制 字符串缓冲池 字符串拼接机制