下面来看看,对于字符串 “p” 和 “s” 的匹配,算法具体是若何运行的。前三个步调与膳绫擎类似,接着,字符 ‘d’ 在字符串 “p” 并未找到,是以我们直接跳过等于“p”字符串长度的字符数,之后逼揭捉?速找到了一个匹配。
而,当别的一个变量也被雷同的字符串 ‘a’ 赋值瓯,又会若何呢?
- 1>>> s3 = 'a'
上述代码履行后,将返回之前已创建的内容雷同的字符串对象。是以,‘s1’ 和 ‘s3’ 两个变量都将指向同一个字符串对象。 数组 “characters” 就是用于检测字符串 ‘a’ 是否已经存在,若存在,则返回指向该字符串对象的指针。
- if (size == 1 && (op = characters[*str & UCHAR_MAX]) != NULL)
- {
- ...
- return (PyObject *)op;
- }
那么,字符 ‘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>>> s4 = 'c'
那么,我们将获得如下结不雅:
我们还能发明,当按照下面 Python 脚本中的方法对一个字符串元素进行拜访时,数组 “characters” 如有效武之地。
- >>> s5 = 'abc'
- >>> s5[0]
- 'a'
膳绫擎第二行代铝闼楝返回的是数组 “characters” 偏移量为 97 的地位内的指针元素,而非新建一个值为 ‘a’的字符串。当我们拜访某个字符串中的元素时,一个名叫 “string_item” d的函数将被调用,下方给出了函数体代码。个中,参数 ‘a’ 便对应着字符串 “abc”,而参数 ‘i’ 就是拜访数组的索引值(本例中便为 0 ),函数返回的是指向某个字符串对象的指针。
- static PyObject *
- string_item(PyStringObject *a, register Py_ssize_t i)
- {
- char pchar;
- PyObject *v;
推荐阅读
大年夜家都知道闯红灯是违法的,但几乎每小我都闯过红灯,为什么?就因为违法成本低、很少有人管,并且即便闯了也很难被及时发明。对闯红灯行动现场抓拍不过跟着人脸辨认技巧的成长,这个>>>详细阅读
本文标题:深入了解Python字符串对象的实现
地址:http://www.17bianji.com/lsqh/35733.html
1/2 1