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

为什么Python3中字节与str的比较失败,python,python-3.x,python-2.x,Python,Python 3.x,Python 2.x,在Python3中,此表达式的计算结果为False: b"" == "" 而在Python2中,这种比较是真的: u"" == "" 在这两种情况下,使用is检查身份显然都会失败 但是为什么他们要在Python3中实现这样的行为呢?设计者决定在将字节与字符串进行比较时不采用强制编码,因此它属于Python3.x的默认行为,即包含不同类型的比较失败。在Python3中,字符串是Unicode。用于保存文本的类型是str,用于保存数据的类型是字节 str和bytes类型不能混合,必须始终在它们之

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

b"" == ""
而在Python2中,这种比较是
真的

u"" == ""
在这两种情况下,使用
is
检查身份显然都会失败


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

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

在Python3中,字符串是Unicode。用于保存文本的类型是
str
,用于保存数据的类型是
字节

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

因此,如果执行“解码()=”
操作,您将得到
True

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

有关Python 2.x中读取的更多信息,unicode的设计目标是通过在两种类型之间进行隐式转换,实现unicode和字节字符串之间的透明操作。当您进行比较时,
u”“==”
,首先将
unicode
LHS自动编码为字节字符串,然后与
str
RHS进行比较。这就是它返回
True
的原因

相反,Python3.x从Python2中混乱的unicode中吸取了教训,决定将unicode与字节字符串的所有内容都显式化。因此,
b”“==”
False
,因为字节字符串不再自动转换为unicode进行比较