为什么str.count('')和len(str)给出不同的输出?

时间:2016-10-22 12:58:19

标签: python string python-3.x count

请查看以下代码,并解释为什么str.count('')方法和len(str)函数提供两种不同的输出。

a=''
print(len(a))
print(a.count(''))

输出:

0
1

3 个答案:

答案 0 :(得分:12)

str.count()计算子字符串的非重叠出现次数:

  

返回子字符串 sub 的非重叠出现次数。

字符串''中只出现一个子字符串''的位置:就在开头。因此,计数应该返回1

一般来说,空字符串将在给定字符串中的所有位置处匹配,包括在开头和结尾处,因此计数总是是长度加上1:

>>> (' ' * 100).count('')
101

这是因为字符串的所有字符之间都存在空字符串;对于字符串长度为2,有3个空字符串;一个在开头,一个在两个角色之间,一个在最后。

所以是的,结果是不同的,它们是完全正确的。

答案 1 :(得分:2)

.count('')计算零长度字符串的位置数。您还可以将其视为可能的光标位置数。

"test".count('')

 t e s t
^ ^ ^ ^ ^

不是计算字符数(例如len(str)),而是计算反字符的数量。

答案 2 :(得分:1)

Documentation

  

返回[start,end]范围内子序列sub的非重叠出现次数。可选参数start和end被解释为切片表示法。

如果我们查看implementation,我们会发现它调用了函数stringlib_countsource),它继续执行并返回字符串的长度加1,当sub的长度为零:

if (sub_len == 0)
    return (str_len < maxcount) ? str_len + 1 : maxcount;

source

注意maxcount设置为size_t的最大正值。

当然,这只是一个短暂的结果。如果我们跳过该检查,代码会继续调用FASTSEARCH

FASTSHEARCH implemented怎么样?它继续loop,如果字符串与该位置的子匹配,则检查每个位置。

由于它正在寻找一个空字符串,它会说它在每个位置匹配(在每个位置,它找不到不同的字符,直到子字符的长度)。

请记住,它从头到尾查看包含范围。这意味着它将查找字符串中的每个位置,即:

  • 开始(在第一个角色之前)
  • 在每个字符对之间(在每个字符之后,在下一个字符之前)
  • 结束(在最后一个角色之后)

这是每个角色一个位置(每个角色之前)加一个(结束)。或者如果您愿意,每个角色(每个角色之后)加一个(开始)是一个位置。在任何一种情况下,它都将返回字符串的长度加一。开发人员将其短路以避免循环。