作家
登录

深入了解Python字符串对象的实现

作者: 来源: 2017-06-13 15:03:15 阅读 我要评论

本文介绍了 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机制对应的字典中,后面我们会再次提到这一点。

  1. typedef struct { 
  2.  
  3.     PyObject_VAR_HEAD 
  4.  
  5.     long ob_shash; 
  6.  
  7.     int ob_sstate; 
  8.  
  9.     char ob_sval[1]; 
  10.  
  11. } PyStringObject;  

字符串对象的创建

如下所示,当将一个新的字符串赋给一个变量时,产生了什么?

运行以上代码时,内部的 C 函数 “PyString_FromString” 将被调用处生成类似下面的伪代码:

  1. arguments: string object: 'abc' 
  2.  
  3. returns: Python string object with ob_sval = 'abc' 
  4.  
  5. PyString_FromString(string): 
  6.  
  7.     size = length of string 
  8.  
  9.     allocate string object + size for 'abc'. ob_sval will be of sizesize + 1 
  10.  
  11.     copy string to ob_sval 
  12.  
  13.     return object  

每次用到新的字符串时,都将分派一个字符串对象。

共享字符串对象

Python 有一个优雅的特点,就是变量之间的短字符串是共享的,这一特点可以节俭所需的内存空间。短字符串就是那些长度为 0 个或者 1 个字节的字符串。而全局变量 “interned” 对应一个用于索引这些短字符串的字典。数组 “characters” 也可用于索引那些长度为 1 个字节的字符串,比如单个字母。后面我们将看到数组 “characters” 是若何被应用的。

  1. static PyStringObject *characters[UCHAR_MAX + 1]; 
  2.  
  3. static PyObject *interned;  

下面一路看看:当你在 Python 脚本中将一个短字符串赋值给一个变量时,背后产生了哪些工作。

  1. static PyStringObject *characters[UCHAR_MAX + 1]; 
  2.  
  3. static PyObject *interned;  

内容为 ‘a’ 的字符串对象将被添加到 “interned” 字典中。字典中键(key)是一个指向该字符串对象的指针,而对应的值 就是一个雷同的指针。在数组 “characters” 中,这一新的字符串对象在偏移量为 97 的地位被引用,因为字符 ‘a’ 的ASCII码值就是 97。变量 “s2” 也指向了这一字符串对象。

 1/5    1 2 3 4 5 下一页 尾页

  推荐阅读

  还敢闯红灯?“人脸识别”分分钟让你变“网红”

大年夜家都知道闯红灯是违法的,但几乎每小我都闯过红灯,为什么?就因为违法成本低、很少有人管,并且即便闯了也很难被及时发明。对闯红灯行动现场抓拍不过跟着人脸辨认技巧的成长,这个>>>详细阅读


本文标题:深入了解Python字符串对象的实现

地址:http://www.17bianji.com/lsqh/35733.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)