字符串字面量前的'b'字符表示什么?
12 个回答
这里的 b 表示字节串。
字节是实际的数据,而字符串则是一种抽象的表示方式。
如果你有一个包含多个字符的字符串对象,取出其中一个字符时,它仍然是一个字符串,大小可能会根据编码方式不同而超过1个字节。
但如果你从字节串中取出1个字节,你会得到一个0到255之间的单一8位值。如果这些字符的编码超过1个字节,那么这个字节可能并不能表示一个完整的字符。
老实说,除非你有特别的低级需求,否则我会选择使用字符串。
Python 3.x 对两种类型有明确的区分:
str
='...'
字面量 = 一串 字符。 “字符”是文本的基本单位:可以是字母、数字、标点符号、符号、空格,或者“控制字符”(比如制表符或退格符)。Unicode 标准为每个字符分配一个介于 0 和 0x10FFFF 之间的整数 码点。(实际上,可能会有些不同。Unicode 包含连字和组合字符,所以一串字符的码点数量可能和用户看到的字符数量不一样。)在内部,str
使用一种 灵活的字符串表示,每个码点可以使用 1、2 或 4 个字节。bytes
=b'...'
字面量 = 一串 字节。 “字节”是计算机上可以寻址的最小整数类型,通常是一个 八位组,也就是 8 位单位,因此可以表示 0 到 255 之间的数字。
如果你熟悉:
- Java 或 C#,可以把
str
看作String
,bytes
看作byte[]
; - SQL,
str
可以看作NVARCHAR
,bytes
可以看作BINARY
或BLOB
; - Windows 注册表,
str
可以看作REG_SZ
,bytes
可以看作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)
的简写。
引用一下Python 2.x 的文档:
在 Python 2 中,前面加个 'b' 或 'B' 的标记是被忽略的;这个标记表示在 Python 3 中,这个字符串应该被当作字节串来处理(比如在用 2to3 工具自动转换代码时)。'u' 或 'b' 的前缀后面可以跟一个 'r' 的前缀。
而Python 3 的文档则说明:
字节串的前面总是要加 'b' 或 'B';这样会生成一个字节类型的实例,而不是字符串类型的实例。字节串只能包含 ASCII 字符;数值为 128 或更大的字节必须用转义字符来表示。