字符串文字前面的“b”字符有什么作用?

新手上路,请多包涵

显然,以下是有效的语法:

 b'The string'

我想知道:

  1. 字符串前面的这个 b 字符是什么意思?
  2. 使用它有什么效果?
  3. 什么情况下适合使用它?

我在 SO 上找到了一个 相关的问题,但这个问题是关于 PHP 的,它指出 b 用于指示字符串是二进制的,而不是 Unicode,这是代码所必需的迁移到 PHP 6 时,从 PHP < 6 的版本兼容。我认为这不适用于 Python。

我确实在 Python 网站上找到了有关使用 u 字符以相同的语法将字符串指定为 Unicode 的 文档。不幸的是,它没有在该文档的任何地方提到 b 字符。

另外,出于好奇,是否有比 bu 更多的符号来做其他事情?

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

阅读 844
2 个回答

引用 Python 2.x 文档

在 Python 2 中,前缀 ‘b’ 或 ‘B’ 被忽略;它表示文字应该成为 Python 3 中的字节文字(例如,当代码使用 2to3 自动转换时)。 ‘u’ 或 ‘b’ 前缀后面可能跟有 ‘r’ 前缀。

Python 3 文档 指出:

字节文字总是以’b’或’B’为前缀;它们生成 bytes 类型而不是 str 类型的实例。它们可能只包含 ASCII 字符;数值为 128 或更大的字节必须用转义表示。

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

Python 3.x 对类型进行了明确区分:

  • str = '...' 文字 = Unicode 字符序列(Latin-1、UCS-2 或 UCS-4, 取决于字符串中最宽的字符
  • bytes = b'...' 文字 = 八位字节序列(0 到 255 之间的整数)

如果您熟悉:

  • Java或C#,认为 str 作为 Stringbytes 作为 byte[] ;
  • SQL, think of str as NVARCHAR and bytes as BINARY or BLOB ;
  • Windows注册表,将 str 视为 REG_SZbytes 作为 REG_BINARY .

如果您熟悉 C(++),那么请忘记您所了解的有关 char 和字符串 的所有内容,因为字符不是字节。这个想法早就过时了。

当您想要表示文本时,您可以使用 str

 print('שלום עולם')

当你想表示像结构这样的低级二进制数据时,你可以使用 bytes

 NaN = struct.unpack('>d', b'\xff\xf8\x00\x00\x00\x00\x00\x00')[0]

您可以将 str 编码 为 --- bytes 对象。

 >>> '\uFEFF'.encode('UTF-8')
b'\xef\xbb\xbf'

您可以将 bytes 解码为 str

 >>> b'\xE2\x82\xAC'.decode('UTF-8')
'€'

但是你不能随意混合这两种类型。

 >>> b'\xEF\xBB\xBF' + 'Text with a UTF-8 BOM'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can't concat bytes to str

b'...' 符号有点令人困惑,因为它允许使用 ASCII 字符而不是十六进制数字指定字节 0x01-0x7F。

 >>> b'A' == b'\x41'
True

但我必须强调, 字符不是字节

 >>> 'A' == b'A'
False

在 Python 2.x 中

Python 3.0 之前的版本缺乏这种文本和二进制数据之间的区别。相反,有:

  • unicode = u'...' 文字 = Unicode 字符序列 = 3.x str
  • str = '...' 文字 = 混淆字节/字符序列
    • 通常是文本,以某种未指定的编码进行编码。
    • 但也用于表示二进制数据,如 struct.pack 输出。

为了简化 2.x 到 3.x 的转换, b'...' 文字语法被反向移植到 Python 2.6,以允许区分二进制字符串(应该是 bytes 在 3.x 中)来自文本字符串(在 3.x 中应该是 str )。 b 前缀在 2.x 中不执行任何操作,但告诉 2to3 脚本不要将其转换为 3.x 中的 Unicode 字符串。

所以是的, b'...' Python 中的文字与它们在 PHP 中的用途相同。

另外,出于好奇,是否有比 b 和 u 更多的符号做其他事情?

The r prefix creates a raw string (eg, r'\t' is a backslash + t instead of a tab), and triple quotes '''...'''"""...""" 允许多行字符串文字。

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

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