为什么字节与 str 的比较在 Python 3 中失败?

新手上路,请多包涵

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

 b"" == ""

而在 Python 2 中,这个比较是 True

 u"" == ""

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

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

原文由 steffen 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 658
2 个回答

在 Python 2.x 中,Unicode 的设计目标是通过在两种类型之间进行隐式转换,从而实现 Unicode 和字节字符串之间的透明操作。

当你做比较 u"" == "" 时,Unicode LHS 首先被自动编码成字节串,然后与 str RHS 进行比较。这就是它返回 True 的原因。

相比之下,Python 3.x 从 Python 2 中的 Unicode 混乱中吸取了教训,决定将有关 Unicode 与字节字符串的所有内容都明确化。因此, b"" == ""False 因为字节串不再自动转换为Unicode进行比较。

原文由 oxymor0n 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

strbytes 类型不能混合,您必须始终在它们之间显式转换。 Use str.encode() to go from str to bytes , and bytes.decode() to go from bytes to str .

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

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

有关详细信息,请阅读 文本与。数据而不是 Unicode 与。 8双

原文由 Mazdak 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题