2017-04-12 17 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()といくつかの一見矛盾した行動につながる:様々なstring methodsを試す

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 

、あなたはより多くの同様の奇妙な例を見つけることができます。

私の質問は、なぜ空の文字列がこのように振る舞うんのですか?または、これは空の文字列を処理するメソッドの結果ですか?誰かが洞察力を持っている、またはこの行動の説明/説明の方向に私を指すことができる場合、それは素晴らしいだろう。

答えて

3

Pythonの文字列は空の文字列は、他のすべての文字列のサブセットであるという原則に従ってください。さらに、Python文字列はバイト文字列の連結でもあり、文字列が空の文字列に挟まれたバイトで構成されていることを意味します。次の例であることを確認することができます。

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

ので'a'''+'a'+''でなければならない、と'aa'''+'a'+''+'a'+''でなければなりません。あなたが'a'.startswith('')をチェックすると

、それは文字列は「」技術的に空の文字列で始まることを見ています。 'a'.endswith('')と同じです。ただし、'a'.startswith('a')をチェックすると、空の文字列は無視され、最初のバイトが表示されます。

関連する問題