为什么Python3中的字节与str的比较失败

时间:2015-06-01 18:14:14

标签: python python-3.x python-2.x

在Python3中,此表达式的计算结果为False

b"" == ""

在Python2中,这种比较是True

u"" == ""

在两种情况下,检查is的身份显然都失败了。

但为什么他们会在Python3中实现这样的行为?

3 个答案:

答案 0 :(得分:14)

在python 3中,字符串是Unicode。用于保存文本的类型为str,用于保存数据的类型为bytes

  

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

因此,如果您执行b"".decode() == "",则会获得True

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

有关详细信息,请参阅Text Vs. Data Instead Of Unicode Vs. 8-bi

答案 1 :(得分:13)

在Python 2.x中,unicode的设计目标是在unicode和amp;之间启用透明操作。通过在两种类型之间隐式转换来实现字节串。当您进行比较u"" == ""时,unicode LHS会首先自动编码为字节字符串,然后与str RHS进行比较。这就是它返回True的原因。

相比之下,从Python 2中的unicode混乱中学习的Python 3.x决定将unicode与字节字符串的所有内容都显式化。因此,b"" == ""False,因为字节字符串不再自动转换为unicode进行比较。

答案 2 :(得分:3)

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