在Python3中,此表达式的计算结果为False
:
b"" == ""
在Python2中,这种比较是True
:
u"" == ""
在两种情况下,检查is
的身份显然都失败了。
但为什么他们会在Python3中实现这样的行为?
答案 0 :(得分:14)
在python 3中,字符串是Unicode。用于保存文本的类型为str
,用于保存数据的类型为bytes
。
str
和字节类型不能混合,您必须始终在它们之间进行显式转换。使用str.encode()
从str到字节,bytes.decode()
从字节到str。
因此,如果您执行b"".decode() == ""
,则会获得True
:
>>> b"".decode() == ""
True
答案 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的默认行为,因此包含不同类型的比较失败。