请查看以下代码,并解释为什么str.count('')
方法和len(str)
函数提供两种不同的输出。
a=''
print(len(a))
print(a.count(''))
输出:
0
1
答案 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)
返回[start,end]范围内子序列sub的非重叠出现次数。可选参数start和end被解释为切片表示法。
如果我们查看implementation,我们会发现它调用了函数stringlib_count
(source),它继续执行并返回字符串的长度加1,当sub的长度为零:
if (sub_len == 0)
return (str_len < maxcount) ? str_len + 1 : maxcount;
(source)
注意:maxcount
设置为size_t的最大正值。
当然,这只是一个短暂的结果。如果我们跳过该检查,代码会继续调用FASTSEARCH。
FASTSHEARCH implemented怎么样?它继续loop,如果字符串与该位置的子匹配,则检查每个位置。
由于它正在寻找一个空字符串,它会说它在每个位置匹配(在每个位置,它找不到不同的字符,直到子字符的长度)。
请记住,它从头到尾查看包含范围。这意味着它将查找字符串中的每个位置,即:
这是每个角色一个位置(每个角色之前)加一个(结束)。或者如果您愿意,每个角色(每个角色之后)加一个(开始)是一个位置。在任何一种情况下,它都将返回字符串的长度加一。开发人员将其短路以避免循环。