Python中的startswith方法是如何工作的?

6

我不理解 str.startswith 方法的行为。

如果我执行 "hello".startswith(""),它会返回 True。理论上它不应该以空字符串开头。

>>> "hello".startswith("")
True

文档说明如下:

如果字符串以前缀开头,则返回True,否则返回False。prefix也可以是要查找的多个前缀的元组。

那么这个函数是如何工作的呢?

4
所有字符串都以一个空字符串开始,但是。 - OneCricketeer
2
@cricket_007 技术上讲,可以有任意数量的空字符串 :) - pvg
1
@pvg:Python 只计算空字符串一次,幸运的是。 :-) 尝试使用 str.count(),你会发现在任何给定的输入字符串s中,恰好有 len(s) + 1 个空字符串。 - Martijn Pieters
2个回答

14

str.startswith() 可以用 Python 代码表示为:

 def startswith(source, prefix):
    return source[:len(prefix)] == prefix

它测试源字符串的前len(prefix)个字符是否等于前缀。如果您传入长度为零的前缀,那意味着将测试前0个字符。长度为0的字符串始终等于任何其他长度为0的字符串。

请注意,这也适用于其他字符串测试:

>>> s = 'foobar'
>>> '' in s
True
>>> s.endswith('')
True
>>> s.find('')
0
>>> s.index('')
0
>>> s.count('')
7
>>> s.replace('', ' -> ')
' -> f -> o -> o -> b -> a -> r -> '

最后两个演示,一个是计数空字符串,另一个是将空字符串替换为其他内容,表明你可以在输入字符串的每个位置找到空字符串。


startswith的最坏时间复杂度是O(n),其中n是字符串长度;平均时间复杂度是O(m),其中m是前缀的长度,这个正确吗? - Mr Matrix
3
最坏情况下时间复杂度为 O(m),即最多只需检查 m 个字符就能确定它是否为一个前缀。 - Martijn Pieters

3

如果一个字符串p是另一个字符串s的前缀,那么有s = p + x,因此空字符串是所有字符串的前缀(类似于0,s = 0 + s)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接