字符串字面量前的'b'字符表示什么?

1408 投票
12 回答
1218728 浏览
提问于 2025-04-16 19:07

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

b'The string'

我想知道:

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

我在这里找到一个相关的问题,不过那个问题是关于PHP的,它提到 b 是用来表示字符串是二进制的,而不是Unicode,这在从PHP 6之前的版本迁移到PHP 6时是需要的。我觉得这和Python没有关系。

我还在Python网站上找到这份文档,里面提到在相同的语法中使用 u 字符来指定字符串为Unicode。不幸的是,文档中没有提到b 字符。

另外,出于好奇,除了 bu,还有其他符号可以做不同的事情吗?

12 个回答

44

这里的 b 表示字节串。

字节是实际的数据,而字符串则是一种抽象的表示方式。

如果你有一个包含多个字符的字符串对象,取出其中一个字符时,它仍然是一个字符串,大小可能会根据编码方式不同而超过1个字节。

但如果你从字节串中取出1个字节,你会得到一个0到255之间的单一8位值。如果这些字符的编码超过1个字节,那么这个字节可能并不能表示一个完整的字符。

老实说,除非你有特别的低级需求,否则我会选择使用字符串。

1209

Python 3.x 对两种类型有明确的区分:

  • str = '...' 字面量 = 一串 字符。 “字符”是文本的基本单位:可以是字母、数字、标点符号、符号、空格,或者“控制字符”(比如制表符或退格符)。Unicode 标准为每个字符分配一个介于 0 和 0x10FFFF 之间的整数 码点。(实际上,可能会有些不同。Unicode 包含连字和组合字符,所以一串字符的码点数量可能和用户看到的字符数量不一样。)在内部,str 使用一种 灵活的字符串表示,每个码点可以使用 1、2 或 4 个字节。
  • bytes = b'...' 字面量 = 一串 字节。 “字节”是计算机上可以寻址的最小整数类型,通常是一个 八位组,也就是 8 位单位,因此可以表示 0 到 255 之间的数字。

如果你熟悉:

  • Java 或 C#,可以把 str 看作 Stringbytes 看作 byte[]
  • SQL,str 可以看作 NVARCHARbytes 可以看作 BINARYBLOB
  • 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 中

在 3.0 之前的 Python 版本中,没有这种文本和二进制数据的区分。取而代之的是:

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

为了简化从 2.x 到 3.x 的过渡,b'...' 字面量语法被引入到 Python 2.6,以便区分二进制字符串(在 3.x 中应该是 bytes)和文本字符串(在 3.x 中应该是 str)。在 2.x 中,b 前缀没有任何作用,但它告诉 2to3 脚本在 3.x 中不要将其转换为 Unicode 字符串。

所以是的,Python 中的 b'...' 字面量和 PHP 中的作用是一样的。

另外,出于好奇,还有其他符号,比如 b 和 u,能做其他事情吗?

r 前缀创建一个原始字符串(例如,r'\t' 是一个反斜杠 + t,而不是一个制表符),三重引号 '''...'''"""...""" 允许多行字符串字面量。

f 前缀(在 Python 3.6 中引入)创建一个“格式化字符串字面量”,可以引用 Python 变量。例如,f'My name is {name}.''My name is {0}.'.format(name) 的简写。

543

引用一下Python 2.x 的文档

在 Python 2 中,前面加个 'b' 或 'B' 的标记是被忽略的;这个标记表示在 Python 3 中,这个字符串应该被当作字节串来处理(比如在用 2to3 工具自动转换代码时)。'u' 或 'b' 的前缀后面可以跟一个 'r' 的前缀。

Python 3 的文档则说明:

字节串的前面总是要加 'b' 或 'B';这样会生成一个字节类型的实例,而不是字符串类型的实例。字节串只能包含 ASCII 字符;数值为 128 或更大的字节必须用转义字符来表示。

撰写回答