'b'字符在字符串前面做了什么?
显然,以下是有效的语法
my_string = b'The string'
我想知道:
b
字符是什么意思? 我在SO上发现了一个相关的问题,但是这个问题与PHP相关,并且它指出b
用于表示字符串是二进制的,而不是Unicode,这是代码与PHP版本兼容所需的< 6,迁移到PHP 6.我不认为这适用于Python。
我在Python网站上找到了关于在相同语法中使用u
字符来指定字符串为Unicode的文档。 不幸的是,它没有提到该文档中任何地方的b字符。
另外,出于好奇,除了b
和u
之外,还有其他符号吗?
引用Python 2.x文档:
在Python 2中忽略'b'或'B'的前缀; 它表明文字应该成为Python 3中的字节文字(例如,当代码自动转换为2to3时)。 'u'或'b'前缀可以后跟'r'前缀。
Python 3.3文档指出:
字节文字总是以'b'或'B'作为前缀; 它们会生成字节类型的实例,而不是str类型。 它们可能只包含ASCII字符; 数值为128或更大的字节必须用转义符表示。
Python 3.x明确区分了两种类型:
str
= '...'
文字=一系列Unicode字符(UTF-16或UTF-32,取决于Python编译的方式) bytes
= b'...'
文字=一串八位字节(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'xffxf8x00x00x00x00x00x00')[0]
您可以将str
编码为一个bytes
对象。
>>> 'uFEFF'.encode('UTF-8')
b'xefxbbxbf'
你可以将一个bytes
解码为一个str
。
>>> b'xE2x82xAC'.decode('UTF-8')
'€'
但是你不能自由混合这两种类型。
>>> b'xEFxBBxBF' + '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'...'
literals = Unicode字符序列= 3.x str
str
= '...'
文字=混杂字节/字符的序列 struct.pack
输出。 为了缓解2.x到3.x的转换, b'...'
文字语法被反向移植到Python 2.6,以允许区分文本中的二进制字符串(应该是3.x中的bytes
)字符串(应该是3.x中的str
)。 b
前缀在2.x中不做任何事情,但是告诉2to3
脚本不要将它转换为3.x中的Unicode字符串。
所以是的, b'...'
文字与PHP中b'...'
文字具有相同的目的。
另外,出于好奇,除了b和u之外,还有其他符号吗?
r
前缀创建一个原始字符串(例如, r't'
是一个反斜杠+ t
而不是一个制表符),而三重引号'''...'''
或者"""..."""
允许多线字符串文字。
b表示一个字节串。
字节是实际数据。 字符串是一个抽象。
如果你有多字符的字符串对象,并且你接受了一个字符,那么它将是一个字符串,并且它的大小可能会超过1个字节,具体取决于编码。
如果使用一个字节字符串占用1个字节,您将从0-255获得一个8位值,如果由于编码导致这些字符> 1个字节,则它可能不会表示完整字符。
TBH我会使用字符串,除非我有一些特定的低级别原因使用字节。
链接地址: http://www.djcxy.com/p/53093.html上一篇: What does the 'b' character do in front of a string literal?
下一篇: Is it pythonic for a function to return multiple values?