观察以下互动环节:
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 的此类知识,但这似乎会导致一些非常令人困惑的问题。例如,如果空字符串作为变量传入,而只是碰巧 是一个空字符串,您可能会得到一些令人惊讶的结果。该行为似乎也有点不一致,因为基于上面的交互式 session ,我认为以下会生成字符串中所有字符的列表(类似于 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
方法处理空字符串的结果?如果有人有任何见解,或者可以指出我对这种行为的解释/描述的方向,那就太棒了。
最佳答案
Python 字符串遵循空字符串是所有其他字符串的子集的原则。此外,python 字符串也是字节串的串联,这意味着字符串由夹在空字符串之间的字节组成。您可以通过以下示例看到这一点:
>>>'a'.count('')
2
>>>'aa'.count('')
3
>>>'string'.count('')
7
所以'a'
一定是''+'a'+''
,'aa'
一定是' '+'a'+''+'a'+''
。
当您检查 'a'.startswith('')
时,它会发现字符串 'a' 在技术上以空字符串开头。与 'a'.endswith('')
相同。但是,当您检查 'a'.startswith('a')
时,它会忽略空字符串并查看第一个字节。
关于python - Python 字符串中出现意外的空字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43359095/