2017-04-12 101 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')時,它會忽略空字符串並查看第一個字節。