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

kri*_*iss 97 python syntax byte python-3.x

在python源代码中,我偶然发现我在字符串之前看到了一个小b:

b"abcdef"
Run Code Online (Sandbox Code Playgroud)

我知道u前缀表示unicode字符串,以及r原始字符串文字的前缀.

什么b样的代码和哪种源代码是有用的,因为它看起来完全像没有任何前缀的普通字符串?

Mar*_*ers 86

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

如果您在Python 3源代码中看到它使用,则表达式会创建一个bytes对象,而不是常规的Unicode str对象.如果您在Python shell中看到它或作为列表,dict或其他容器内容的一部分回显,那么您会看到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])
Run Code Online (Sandbox Code Playgroud)

和索引给你回整数(但切片产生一个新bytes值;对于上面的例子中,value[0]给你72,但是value[:1]b'H'作为72是用于大写字母的ASCII码点ħ).

bytes模型二进制数据,包括编码文本.如果您的bytes值确实包含文本,则需要首先使用正确的编解码器对其进行解码.例如,如果数据编码为UTF-8,则可以使用以下命令获取Unicode str值:

strvalue = bytesvalue.decode('utf-8')
Run Code Online (Sandbox Code Playgroud)

相反,要从str对象中的文本转到bytes需要编码.您需要决定要使用的编码; 默认是使用UTF-8,但您需要的是高度依赖于您的用例:

bytesvalue = strvalue.encode('utf-8')
Run Code Online (Sandbox Code Playgroud)

您也可以使用构造函数bytes(strvalue, encoding)来执行相同的操作.

解码和编码方法都需要额外的参数来指定应该如何处理错误.

Python 2,版本2.6和2.7也支持使用b'..'字符串文字语法创建字符串文字,以简化适用于Python 2和3的代码.

bytes对象是不可变的,就像str字符串一样.如果需要具有可变字节值,请使用bytearray()对象.


wRA*_*RAR 60

这是Python3 bytes 文字.Python 2.5及更早版本中没有此前缀(它相当于2.x的纯字符串,而3.x的纯字符串相当于u2.x中前缀的文字).在Python 2.6+中,它相当于一个普通字符串,以便与3.x兼容.