Python3では、この式はFalse
として評価されます。
b"" == ""
python2では、この比較はTrue
です。
u"" == ""
is
を使用したIDのチェックは、どちらの場合も明らかに失敗します。
しかし、なぜPython3でそのような振る舞いを実装するのでしょうか?
Python 2.xでは、Unicodeの設計目標は、2つの型の間で暗黙的に変換することにより、Unicodeとバイト文字列の間の透過的な操作を可能にすることです。比較を行う場合u"" == ""
、unicode
LHSは最初に自動的にバイト文字列にエンコードされ、次にstr
RHSと比較されます。それがTrue
を返した理由です。
対照的に、Python 3.x、ユニコードの混乱から学んだPython 2、ユニコードとバイト文字列のすべてを明示的にすることを決定。したがって、b"" == ""
はFalse
です。これは、比較のためにバイト文字列が自動的にUnicodeに変換されなくなったためです。
python 3文字列はUnicodeです。テキストの保持に使用されるタイプはstr
で、データの保持に使用されるタイプはbytes
です。
str
型とバイト型を混在させることはできません。常に明示的に変換する必要があります。str.encode()
を使用してstrからバイトに移動し、bytes.decode()
を使用してバイトからstrに移動します。
したがって、b"".decode() == ""
を実行すると、True
が得られます。
>>> b"".decode() == ""
True
詳細は Unicodeの代わりにテキストとデータを比較する8-bi を参照
設計者は、バイトを文字列と比較するときに強制のエンコーディングを想定しないことを決めたため、Python 3.xのデフォルトの動作に該当するため、異なるタイプを含む比較は失敗します。