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

lib*_*ral 5 python string count python-3.x

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

a=''
print(len(a))
print(a.count(''))
Run Code Online (Sandbox Code Playgroud)

输出:

0
1
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 12

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

返回substring sub的非重叠出现次数.

在字符串中只''出现一个子字符串的位置'':正好在开头.所以计数应该返回1.

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

>>> (' ' * 100).count('')
101
Run Code Online (Sandbox Code Playgroud)

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

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

  • 我不确定"在字符串''中出现子字符串'的确存在一个这样的地方:就在开始时." 是正确的方式.CPython似乎特殊情况下`len(substr)== 0`和[return`len(str)+ 1`](https://github.com/python/cpython/blob/master/Objects/stringlib/count .H#L16) (3认同)
  • 我很不清楚`count()`在传递空字符串时应该返回什么.如何计算出现次数是常规问题,我认为在这种情况下抛出一个`ValueError`是合理的."非重叠"表示两次出现的交集是空字符串,因此如果在索引0处出现两次空字符串,则它们实际上是非重叠的. (3认同)
  • @MartijnPieters 而且我只是强调我的观点,对于空字符串作为另一个字符串的非重叠子字符串出现的频率这个问题没有“自然”的答案。_无限经常_与_字符串长度加一个_一样有效。 (3认同)
  • @ JimFasarakis-Hilliard:我不确定您是否已完全阅读我的答案,但我想确切地说的是代码的作用。 (2认同)
  • 是的,我看到你确实指出了“len + 1”部分;我只是想知道是否有必要指出当“substr”为空时*实际上*不会发生计数(但是,这是一个实现细节,所以,也许不是)。 (2认同)
  • @MartijnPieters实际上,我认为还有更多.我不认为有可能实现这一点而不使空字符串成为一种特殊情况.您通常会找到字符串匹配的第一个位置,增加计数器,然后继续搜索匹配结束的位置.对于空字符串,这将给出一个无限循环,与我上面的论点一致. (2认同)
  • @SvenMarnach:可以,但是我不是在谈论实现。我说的是原则。 (2认同)