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

ste*_*fen 19 python python-2.x python-3.x

在Python3中,此表达式的计算结果如下False:

b"" == ""
Run Code Online (Sandbox Code Playgroud)

而在Python2中,这种比较是True:

u"" == ""
Run Code Online (Sandbox Code Playgroud)

is在两种情况下,检查身份都明显失败.

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

oxy*_*r0n 18

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

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


Kas*_*mvd 15

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

在str和字节类型不能混用,你总是必须明确他们之间的转换.用于str.encode()从str到字节,bytes.decode()从bytes到str.

因此,如果你这样做,b"".decode() == ""你会得到True:

>>> b"".decode() == ""
True
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请阅读文本.数据而不是Unicode Vs. 8 BI


Ign*_*ams 5

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