web-dev-qa-db-ja.com

Python3でバイトとstrの比較が失敗するのはなぜですか

Python3では、この式はFalseとして評価されます。

b"" == ""

python2では、この比較はTrueです。

u"" == ""

isを使用したIDのチェックは、どちらの場合も明らかに失敗します。

しかし、なぜPython3でそのような振る舞いを実装するのでしょうか?

19
steffen

Python 2.xでは、Unicodeの設計目標は、2つの型の間で暗黙的に変換することにより、Unicodeとバイト文字列の間の透過的な操作を可能にすることです。比較を行う場合u"" == ""unicode LHSは最初に自動的にバイト文字列にエンコードされ、次にstr RHSと比較されます。それがTrueを返した理由です。

対照的に、Python 3.x、ユニコードの混乱から学んだPython 2、ユニコードとバイト文字列のすべてを明示的にすることを決定。したがって、b"" == ""Falseです。これは、比較のためにバイト文字列が自動的にUnicodeに変換されなくなったためです。

16
oxymor0n

python 3文字列はUnicodeです。テキストの保持に使用されるタイプはstrで、データの保持に使用されるタイプはbytesです。

str型とバイト型を混在させることはできません。常に明示的に変換する必要があります。 str.encode()を使用してstrからバイトに移動し、bytes.decode()を使用してバイトからstrに移動します。

したがって、b"".decode() == ""を実行すると、Trueが得られます。

>>> b"".decode() == ""
True

詳細は Unicodeの代わりにテキストとデータを比較する8-bi を参照

15
Kasramvd

設計者は、バイトを文字列と比較するときに強制のエンコーディングを想定しないことを決めたため、Python 3.xのデフォルトの動作に該当するため、異なるタイプを含む比較は失敗します。