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

Python 为什么str.count(';';)和len(str)给出不同的输出?,python,string,python-3.x,count,Python,String,Python 3.x,Count,请看下面的代码,并解释为什么str.count(“”)方法和len(str)函数给出两种不同的输出 a='' print(len(a)) print(a.count('')) 输出: 0 1 str.count() 返回子字符串sub的非重叠出现次数 在字符串'中正好有一个这样的位置,子字符串'出现在开头。因此,计数应返回1 一般来说,空字符串将在给定字符串的所有位置匹配,包括开始和结束处的右侧,因此计数应始终为长度加1: >>> (' ' * 100).count('')

请看下面的代码,并解释为什么
str.count(“”)
方法和
len(str)
函数给出两种不同的输出

a=''
print(len(a))
print(a.count(''))
输出:

0
1
str.count()

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

在字符串
'
中正好有一个这样的位置,子字符串
'
出现在开头。因此,计数应返回
1

一般来说,空字符串将在给定字符串的所有位置匹配,包括开始和结束处的右侧,因此计数应始终为长度加1:

>>> (' ' * 100).count('')
101
这是因为空字符串被认为存在于字符串的所有字符之间;对于长度为2的字符串,有3个空字符串;一个在开头,一个在两个字符之间,一个在结尾

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

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

"test".count('')

 t e s t
^ ^ ^ ^ ^
您不是在计算字符数(如
len(str)
),而是在计算反字符数。

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

如果我们看一下,就会发现它调用函数
stringlib_count
(),当子元素的长度为零时,该函数将继续并返回字符串长度加1:

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

注意:
maxcount
设置为的最大正值


当然,这只是一个很短的电路。如果我们跳过这个检查,代码将继续调用

怎么样?它继续执行,检查每个位置的字符串是否与该位置的子字符串匹配

因为它正在寻找一个空字符串,所以它会说它在每个位置都匹配(在每个位置,它都找不到与子字符串长度不同的字符)

请记住,它从开始到结束都在包含范围内。这意味着它将查看字符串中的每个位置,即:

  • 开头(在第一个字符之前)
  • 每个字符对之间(每个字符后,下一个字符前)
  • 结尾(在最后一个字符之后)

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

为什么他们要给出相同的输出?您的空字符串中有一个空字符串。空字符串的长度为0。那么,为什么a='',因为在“开始”和第一个空格之间有一个空字符串,在第一个空格和第二个空格之间有一个空字符串,在最后一个空格和结束之间有一个空字符串。非常感谢@Martijn Pieters。。。。现在我明白了python中count()和len()之间的明显区别。。。。非常感谢,我不确定“子字符串“”在字符串“”中正好有一个这样的位置:在开头的右边。”是否是正确的表达方式。CPython似乎只是特例
len(substr)==0
和@JimFasarakis Hilliard:我不确定您是否已经完全阅读了我的答案,但我说的正是那里的代码所做的。我不清楚传递空字符串时
count()
应该返回什么。如何计算发生次数是惯例问题,我认为在这种情况下抛出
ValueError
是合理的。“不重叠”意味着两次出现的交点是空字符串,因此如果索引0处有两次出现的空字符串,它们实际上是不重叠的。@MartijnPieters实际上,我认为还有更多。我认为如果不让空字符串成为一种特殊情况,就不可能实现这一点。您通常会找到字符串匹配的第一个位置,增加计数器,然后继续搜索匹配结束的位置。对于空字符串,这将产生一个无限循环,与我上面的论点一致。@MartijnPieters,我只是强调我的观点,对于空字符串作为另一个字符串的非重叠子字符串出现的频率这个问题,没有“自然”的答案。“无限经常”是一个与字符串长度加1同样有效的答案。对于至少包含2个字符的字符串,这种解释既好又直观。在下面,它变暗了。