Python字符串中的意外空字符串

ele*_*han 5 python string python-2.7

观察以下交互式会话:

In [1]: s = 'emptiness'

In [2]: s.replace('', '*')
Out[2]: '*e*m*p*t*i*n*e*s*s*'

In [3]: s.count('')
Out[3]: 10
Run Code Online (Sandbox Code Playgroud)

我今天发现了这一点,这对我来说有点令人困惑和惊讶。

我喜欢学习有关Python这样的东西,但是似乎这可能会导致一些令人困惑的陷阱。例如,如果空字符串中传递作为一个变量,只是碰巧是一个空字符串,你可以用一些令人惊讶的结果而告终。该行为似乎也有些不一致,因为基于上面的交互式会话,我认为以下内容将生成字符串中所有字符的列表(类似于JavaScript行为)。相反,您得到一个错误:

In [4]: s.split('')
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-4-c31bd2432bc1> in <module>()
----> 1 s.split('')

ValueError: empty separator
Run Code Online (Sandbox Code Playgroud)

此外,这会导致一些看似矛盾的行为str.endswith()str.startswith()

In [5]: s.endswith('')
Out[5]: True

In [6]: s.endswith('s')
Out[6]: True

In [7]: s.startswith('')
Out[7]: True

In [8]: s.startswith('e')
Out[8]: True
Run Code Online (Sandbox Code Playgroud)

通过尝试各种字符串方法,您可以找到更多类似的奇怪示例。

我的问题是,为什么空字符串会这样?还是这是str方法处理空字符串的结果?如果任何人有任何见解,或可以向我指出这种行为的解释/说明,那就太好了。

lor*_*tar 5

Python字符串遵循以下原则:空字符串是其他所有字符串的子集。此外,python字符串也是字节字符串的串联,这意味着字符串由夹在空字符串之间的字节组成。您可以通过以下示例看到这一点:

>>>'a'.count('')
2
>>>'aa'.count('')
3
>>>'string'.count('')
7
Run Code Online (Sandbox Code Playgroud)

所以'a'必须如此''+'a'+'',而且'aa'必须如此''+'a'+''+'a'+''

当您检查时'a'.startswith(''),它会看到字符串'a'从技术上说是一个空字符串。相同'a'.endswith('')。但是,当您检查时'a'.startswith('a'),它将忽略空字符串,并查看第一个字节。