为什么在 Python 3 中字节与 str 的比较失败?

问题描述 投票:0回答:3

在 Python 3 中,此表达式的计算结果为

False
:

b"" == ""

虽然在 Python 2 中这个比较是

True

u"" == ""

在这两种情况下,用

is
检查身份显然都失败了。

但是他们为什么要在 Python 3 中实现这样的行为?

python python-3.x python-2.x
3个回答
29
投票

在 Python 3 中,字符串是 Unicode。用于保存文本的类型是

str
,用于保存数据的类型是
bytes
.

str
bytes
类型不能混合,您必须始终在它们之间显式转换。使用
str.encode()
str
bytes
,使用
bytes.decode()
从字节到
str
.

因此,如果你这样做

b"".decode() == ""
,你会得到
True

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

有关更多信息,请阅读文本与。数据而不是 Unicode 与。 8-bi.


25
投票

在 Python 2.x 中,Unicode 的设计目标是通过在 Unicode 和字节串之间进行隐式转换,实现两种类型之间的透明操作。

当你做比较

u"" == ""
时, Unicode LHS 先被自动编码成字节串,然后与
str
RHS 进行比较。这就是它返回
True
.

的原因

相比之下,Python 3.x 从 Python 2 中的 Unicode 混乱中吸取了教训,决定将有关 Unicode 与字节字符串的所有内容都明确化。因此,

b"" == ""
False
因为字节串不再自动转换为 Unicode 进行比较。


5
投票

设计者决定在将字节与字符串进行比较时不采用强制编码,因此它属于 Python 3.x 的默认行为,即包含不同类型的比较失败。

© www.soinside.com 2019 - 2024. All rights reserved.