python字符串前的a前缀是什么意思?


107

在python源代码中,我偶然发现在类似如下的字符串之前看到一个小b

b"abcdef"

我知道u表示unicode字符串的r前缀和原始字符串文字的前缀。

b它看起来像一个没有任何前缀的纯字符串,它代表什么?在哪种源代码中有用?


10
@SLott:跟着你提供你会看到在B前缀的链接不会在字符串前缀允许... 2.6(貌似在参考材料中的小错误)。谷歌搜索这类事情并不容易。我尝试了类似“ b python字符串前缀”之类的关键字,但基本没有结果。
克里斯,

使用的链接S.Lott缺少版本说明符;这是关于Python 3的:docs.python.org/3/reference/…。现在,Python 2.6及更高版本也支持该前缀以促进跨版本的Python代码。
马丁·彼得斯

1
这个问题既不是“完全重复”,也不是“我可以在印刷陈述中摆脱这个'b'字符吗?”的问题的答案。 stackoverflow.com/questions/42599851/…您介意不打扰您请不要接受吗?提出询问的人以及实际尝试回答的人都可能会对能够回答提出的实际问题表示赞赏。
me_

Answers:


62

这是Python3 bytes 文字。在Python 2.5和更早版本中不存在此前缀(等效于2.x的纯字符串,而3.x的纯字符串等效u于2.x中带前缀的文字)。在Python 2.6+中,它等效于纯字符串,以与3.x兼容


@WRAR:是在python 2.6代码中看到的,似乎是在python2.6中引入的
kriss 2010年

在发布之前,我在2.6参考中对其进行了专门检查:docs.python.org/reference/lexical_analysis.html#literals
wRAR 2010年

1
好的,“为了将来的兼容性,Python 2.6将字节添加为str类型的同义词,它还支持b表示法。”,来自“新增功能”。
wRAR 2010年

由于上面的链接现在指向2.7参考,并且添加了b前缀,这是指向旧的伪造参考docs.python.org/release/2.6.8/reference/…
kriss

98

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

如果您看到它在Python 3源代码中使用过,该表达式将创建一个bytes对象,而不是常规Unicode str对象。如果您看到它在Python Shell中回显,或者作为列表,字典或其他容器内容的一部分回显,那么您会看到bytes使用此符号表示的对象。

bytes对象基本上包含一个介于0-255之间的整数序列,但是当表示这些对象时,Python 会将这些字节显示为ASCII码点,以使其更易于读取其内容。外部任何字节可打印的ASCII字符范围被示为转义序列(例如\n\x82等)。相反,您可以同时使用ASCII字符和转义序列来定义字节值。对于ASCII值,使用其数字值(例如b'A'== b'\x41'

因为bytes对象由整数序列组成,所以您可以bytes从其他任何整数序列(其值在0-255范围内)构造一个对象,例如列表:

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

和索引给你回的整数(但切片产生一个新bytes值;对于上面的例子中,value[0]给你72,但是value[:1]b'H'作为72是用于大写字母的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()对象

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.