2017-04-12 110 views
4

遵守以下交互式会话:今天这个意外空字符串字符串

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 

我发现,这是一个有点混乱和令人惊讶的我。

我喜欢学习类似Python的东西,但是这似乎会导致一些令人困惑的陷阱。例如,如果空字符串作为变量传入,并且只有发生了为空字符串,那么最终会出现一些令人惊讶的后果。这种行为似乎也有点不一致,因为基于上面的交互式会话,我认为以下内容会产生字符串中所有字符的列表(类似于JavaScript行为)。相反,你会得到一个错误:

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

ValueError: empty separator 

而且,这会导致一些看似矛盾的行为与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 

各种string methods做实验,你可以找到更多类似的奇怪的例子。

我的问题是为什么这样做的空字符串的行为?或者这是str方法如何处理空字符串的结果?如果任何人有任何见解,或者可以指示我对这种行为的解释/描述的方向,那就太棒了。

回答

3

Python字符串遵循的原则是空字符串是每个其他字符串的子集。此外,python字符串也是字节字符串的连接,意味着字符串由夹在空字符串之间的字节组成。你可以看到,下面的例子:

>>>'a'.count('') 
2 
>>>'aa'.count('') 
3 
>>>'string'.count('') 
7 

所以'a'必须''+'a'+'''aa'必须''+'a'+''+'a'+''

当您检查'a'.startswith('')时,它看到字符串'a'技术上以空字符串开头。 'a'.endswith('')也是如此。但是,当您检查'a'.startswith('a')时,它会忽略空字符串并查看第一个字节。