作家
登录

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

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

下面来看看,对于字符串 “p” 和 “s” 的匹配,算法具体是若何运行的。前三个步调与膳绫擎类似,接着,字符 ‘d’ 在字符串 “p” 并未找到,是以我们直接跳过等于“p”字符串长度的字符数,之后逼揭捉?速找到了一个匹配。

而,当别的一个变量也被雷同的字符串 ‘a’ 赋值瓯,又会若何呢?

  1. 1>>> s3 = 'a' 

上述代码履行后,将返回之前已创建的内容雷同的字符串对象。是以,‘s1’ 和 ‘s3’ 两个变量都将指向同一个字符串对象。 数组 “characters” 就是用于检测字符串 ‘a’ 是否已经存在,若存在,则返回指向该字符串对象的指针。

  1. if (size == 1 && (op = characters[*str & UCHAR_MAX]) != NULL
  2.  
  3.  
  4.     ... 
  5.  
  6.     return (PyObject *)op; 
  7.  

那么,字符 ‘a’ 在字符串 “p”(‘abcab’)中是否存在呢?1110 & (1 << (‘a’ & 0X1F)) 运算结不雅的值是否为 true 呢?因为 1110 & (1 << (‘a’ & 0X1F)) = 1110 & 10 = 10,可知 ‘a’ 确切存在于 ‘abcab’。当检测字符 ‘d’时,我们获得的是 false,对于其他字符(大年夜 ‘e’ 到 ‘z’)也是同样结不雅。是以,在本例中词攀类过滤器表示十搀扶直。 变量 “skip” 对应目标字符在主字符串中最后一个成功匹配的字符的索引地位(大年夜后向前匹配)。假若模式串的最后一个匹配字符在主字符串中不存在,则 “skip” 值为 模式串 “p” 的长度减去 1。本例中,模式串最后一个为匹配字符位 ‘b’,因为其在主串查找的当前地位向后跳两个字符后可以或许匹配到,是以变量 “skip” 的值为2。这个变量应用于一种名叫坏字符跳跃(bad-character skip)的规矩。在如下示例中,p = ‘abcab’,s = ‘adcabcaba’。大年夜主串 “s” 的 4 号索引地位(大年夜 0 开端计算)开端匹配,若字符匹配成功则向前持续匹配。第一个匹配掉败的索引地位为 1(此处 ‘b’ 不等于 ‘d’)。我们可以看到,在模式串和主串最开端匹配的末尾地位往后数三个字符,主串中也有一个 ‘b’,而字符 ‘c’ 也存在于 “p” 中,是以我们跳过了随后的 ‘b’。

下面我们新建一个内容为 ‘c’ 的短字符串:

  1. 1>>> s4 = 'c' 

那么,我们将获得如下结不雅:

我们还能发明,当按照下面 Python 脚本中的方法对一个字符串元素进行拜访时,数组 “characters” 如有效武之地。

  1. >>> s5 = 'abc' 
  2.  
  3. >>> s5[0] 
  4.  
  5. 'a'  

膳绫擎第二行代铝闼楝返回的是数组 “characters” 偏移量为 97 的地位内的指针元素,而非新建一个值为 ‘a’的字符串。当我们拜访某个字符串中的元素时,一个名叫 “string_item” d的函数将被调用,下方给出了函数体代码。个中,参数 ‘a’ 便对应着字符串 “abc”,而参数 ‘i’ 就是拜访数组的索引值(本例中便为 0 ),函数返回的是指向某个字符串对象的指针。

  1. static PyObject * 
  2.  
  3. string_item(PyStringObject *a, register Py_ssize_t i) 
  4.  
  5.  
  6.     char pchar; 
  7.  
  8.     PyObject *v; 
  9.  

  10.   推荐阅读

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

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


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

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

关键词: 探索发现

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

网友点评
自媒体专栏

评论

热度

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