在 Python 3 中,此表达式的计算结果为 False
:
b"" == ""
而在 Python 2 中,这个比较是 True
:
u"" == ""
使用 is
检查身份显然在两种情况下都失败了。
但是他们为什么要在 Python 3 中实现这样的行为呢?
原文由 steffen 发布,翻译遵循 CC BY-SA 4.0 许可协议
在 Python 3 中,此表达式的计算结果为 False
:
b"" == ""
而在 Python 2 中,这个比较是 True
:
u"" == ""
使用 is
检查身份显然在两种情况下都失败了。
但是他们为什么要在 Python 3 中实现这样的行为呢?
原文由 steffen 发布,翻译遵循 CC BY-SA 4.0 许可协议
在 Python 3 中,字符串是 Unicode。用于保存文本的类型是 str
,用于保存数据的类型是 bytes
。
str
和bytes
类型不能混合,您必须始终在它们之间显式转换。 Usestr.encode()
to go fromstr
tobytes
, andbytes.decode()
to go from bytes tostr
.
因此,如果你这样做 b"".decode() == ""
,你会得到 True
:
>>> b"".decode() == ""
True
有关详细信息,请阅读 文本与。数据而不是 Unicode 与。 8双。
原文由 Mazdak 发布,翻译遵循 CC BY-SA 4.0 许可协议
4 回答4.5k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
4 回答3.8k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
1 回答4.4k 阅读✓ 已解决
1 回答3.9k 阅读✓ 已解决
1 回答2.8k 阅读✓ 已解决
在 Python 2.x 中,Unicode 的设计目标是通过在两种类型之间进行隐式转换,从而实现 Unicode 和字节字符串之间的透明操作。
当你做比较
u"" == ""
时,Unicode LHS 首先被自动编码成字节串,然后与str
RHS 进行比较。这就是它返回True
的原因。相比之下,Python 3.x 从 Python 2 中的 Unicode 混乱中吸取了教训,决定将有关 Unicode 与字节字符串的所有内容都明确化。因此,
b"" == ""
是False
因为字节串不再自动转换为Unicode进行比较。