Python字符串前面的b前缀是什么意思?
在我看到的一个Python源代码中,我发现字符串前面有一个小b,就像这样:
b"abcdef"
我知道u
前缀表示一个unicode字符串,还有r
前缀表示一个原始字符串字面量。
那么这个b
代表什么呢?它在什么样的源代码中有用?因为它看起来和普通字符串没有前缀时是一样的。
2 个回答
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()
对象。
这是Python3中的bytes
字面量。这个前缀在Python 2.5及更早的版本中是没有的(它相当于2.x中的普通字符串,而3.x中的普通字符串则相当于2.x中带u
前缀的字面量)。在Python 2.6及以上版本中,它相当于普通字符串,这是为了与3.x版本兼容。