本文介绍了 python 内部是若何治理字符串对象,以及字符串查找操作是若何实现的。
PyStringObject 构造体
Python 中的字符串对象在内部对应一个名叫 PyStringObject 的构造体。“ob_shash” 对应字符串经计算过的 hash值, “ob_sval” 指向一段长度为 “ob_size” 的字符串,且该字符串以‘null’结尾(为了兼容C)。“ob_sval”的初始大年夜小为1个字节,且 ob_sval[0]=0(对应空字符串)。若你还想知道“ob_size”被定义的地位,可以看一看 object.h 头文件中 PyObject_VAR_HEAD 对应部分。“ob_sstate” 用来指导某个字符串是否已经存在于intern机制对应的字典中,后面我们会再次提到这一点。
- typedef struct {
- PyObject_VAR_HEAD
- long ob_shash;
- int ob_sstate;
- char ob_sval[1];
- } PyStringObject;
字符串对象的创建
如下所示,当将一个新的字符串赋给一个变量时,产生了什么?
运行以上代码时,内部的 C 函数 “PyString_FromString” 将被调用处生成类似下面的伪代码:
- arguments: string object: 'abc'
- returns: Python string object with ob_sval = 'abc'
- PyString_FromString(string):
- size = length of string
- allocate string object + size for 'abc'. ob_sval will be of size: size + 1
- copy string to ob_sval
- return object
每次用到新的字符串时,都将分派一个字符串对象。
共享字符串对象
Python 有一个优雅的特点,就是变量之间的短字符串是共享的,这一特点可以节俭所需的内存空间。短字符串就是那些长度为 0 个或者 1 个字节的字符串。而全局变量 “interned” 对应一个用于索引这些短字符串的字典。数组 “characters” 也可用于索引那些长度为 1 个字节的字符串,比如单个字母。后面我们将看到数组 “characters” 是若何被应用的。
- static PyStringObject *characters[UCHAR_MAX + 1];
- static PyObject *interned;
下面一路看看:当你在 Python 脚本中将一个短字符串赋值给一个变量时,背后产生了哪些工作。
- static PyStringObject *characters[UCHAR_MAX + 1];
- static PyObject *interned;
内容为 ‘a’ 的字符串对象将被添加到 “interned” 字典中。字典中键(key)是一个指向该字符串对象的指针,而对应的值 就是一个雷同的指针。在数组 “characters” 中,这一新的字符串对象在偏移量为 97 的地位被引用,因为字符 ‘a’ 的ASCII码值就是 97。变量 “s2” 也指向了这一字符串对象。
推荐阅读
大年夜家都知道闯红灯是违法的,但几乎每小我都闯过红灯,为什么?就因为违法成本低、很少有人管,并且即便闯了也很难被及时发明。对闯红灯行动现场抓拍不过跟着人脸辨认技巧的成长,这个>>>详细阅读
本文标题:深入了解Python字符串对象的实现
地址:http://www.17bianji.com/lsqh/35733.html
1/2 1