Python字符串前面的b前缀是什么意思?

147 投票
2 回答
92736 浏览
提问于 2025-04-15 21:20

在我看到的一个Python源代码中,我发现字符串前面有一个小b,就像这样:

b"abcdef"

我知道u前缀表示一个unicode字符串,还有r前缀表示一个原始字符串字面量。

那么这个b代表什么呢?它在什么样的源代码中有用?因为它看起来和普通字符串没有前缀时是一样的。

2 个回答

142

b 前缀表示一个 bytes 字符串字面量

如果你在 Python 3 的源代码中看到这个前缀,它创建的是一个 bytes 对象,而不是普通的 Unicode str 对象。如果你在 Python 交互式命令行中看到它,或者作为列表、字典或其他容器的内容,那么你看到的就是用这种表示法显示的 bytes 对象。

bytes 对象基本上包含了一系列 0 到 255 之间的整数,但在显示时,Python 会把这些字节以 ASCII 码点 的形式展示,以便更容易阅读它们的内容。任何不在 可打印 ASCII 字符范围 内的字节会以转义序列的形式显示(例如 \n, \x82 等等)。反过来,你可以使用 ASCII 字符和转义序列来定义字节值;对于 ASCII 值,它们的数值会被使用(例如 b'A' 等于 b'\x41')。

因为 bytes 对象由一系列整数构成,所以你可以从任何其他包含 0 到 255 范围内整数的序列(比如列表)构建一个 bytes 对象:

bytes([72, 101, 108, 108, 111])

通过索引你可以得到这些整数(但是切片会产生一个新的 bytes 值;在上面的例子中,value[0] 会给你 72,而 value[:1] 会是 b'H',因为 72 是大写字母 H 的 ASCII 码点)。

bytes 模型用于表示 二进制数据,包括 编码文本。如果你的 bytes 值包含文本,你需要先解码,使用正确的编码格式。例如,如果数据是以 UTF-8 编码的,你可以用以下方式获得一个 Unicode str 值:

strvalue = bytesvalue.decode('utf-8')

相反,要把 str 对象中的文本转换为 bytes,你需要 编码。你需要决定使用哪种编码;默认是使用 UTF-8,但具体需要什么取决于你的使用场景:

bytesvalue = strvalue.encode('utf-8')

你也可以使用构造函数 bytes(strvalue, encoding) 来实现同样的功能。

解码和编码的方法都可以接受一个额外的参数,用来 指定如何处理错误

Python 2 的 2.6 和 2.7 版本也支持使用 b'..' 字符串字面量语法来创建字符串字面量,以便于在 Python 2 和 3 上都能工作。

bytes 对象是不可变的,就像 str 字符串一样。如果你需要一个可变的字节值,可以使用 bytearray() 对象

73

这是Python3中的bytes字面量。这个前缀在Python 2.5及更早的版本中是没有的(它相当于2.x中的普通字符串,而3.x中的普通字符串则相当于2.x中带u前缀的字面量)。在Python 2.6及以上版本中,它相当于普通字符串,这是为了与3.x版本兼容

撰写回答