我想了解python3的bytesbytearray课程.我看过关于它们的文档,但没有全面描述它们的差异以及它们如何与string个对象交互.

推荐答案

bytes and bytearrays are similar...

python3的bytesbytearray类都包含字节数组,每个字节的值都在0到255之间.主要区别在于bytes对象是immutable,这意味着一旦创建,就不能修改其元素.相比之下,bytearray对象允许您修改其元素.

bytesbytearay都提供对字符串进行编码和解码的功能.

bytes and encoding strings

字节对象可以用几种不同的方式构造:

>>> bytes(5)
b'\x00\x00\x00\x00\x00'

>>> bytes([97, 98, 99])
b'abc'

>>> b'abc'
b'abc'

>>> bytes('abc')
TypeError: string argument without an encoding

>>> bytes('abc', 'utf-8')
b'abc'

>>> 'abc'.encode('utf-8')
b'abc'

>>> 'abc'.encode('utf-16')
b'\xff\xfea\x00b\x00c\x00'

>>> 'abc'.encode('utf-16-le')
b'a\x00b\x00c\x00'

请注意最后两个选项之间的区别:"utf-16"指定了通用的utf-16

因为字节对象是不可变的,试图更改其中一个元素

>>> a = bytes('abc', 'utf-8')
>>> a
b'abc'
>>> a[1] = 102
TypeError: 'bytes' object does not support item assignment

字节数组和编码字符串

bytes类似,字节数组可以通过多种方式构造:

>>> bytearray(5)
bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00')

>>>bytearray([1, 2, 3])
bytearray(b'\x01\x02\x03')

>>> bytearray('abc')
TypeError: string argument without an encoding

>>> bytearray('abc', 'utf-8')
bytearray(b'abc')

>>> bytearray('abc', 'utf-16')
bytearray(b'\xff\xfea\x00b\x00c\x00')

>>> bytearray('abc', 'utf-16-le')
bytearray(b'a\x00b\x00c\x00')

因为字节数组是mutable,所以可以修改其元素:

>>> a = bytearray('abc', 'utf-8')
>>> a
bytearray(b'abc')
>>> a[1]=114
>>> a
bytearray(b'arc')

追加字节和字节数组

bytesbytearray个对象可与+运算符连接:

>>> a = bytes(3)
>>> a
b'\x00\x00\x00'

>>> b = bytearray(4)
>>> b
bytearray(b'\x00\x00\x00\x00')

>>> a+b
b'\x00\x00\x00\x00\x00\x00\x00'

>>> b+a
bytearray(b'\x00\x00\x00\x00\x00\x00\x00')

请注意,链接结果采用第一个参数的类型,因此a+b生成bytes对象,b+a生成bytearray.

将字节和字节数组对象转换为字符串

字节和字节数组对象可以使用decode函数转换为字符串.该函数假定您提供的解码类型与编码类型相同.例如:

>>> a = bytes('abc', 'utf-8')
>>> a
b'abc'
>>> a.decode('utf-8')
'abc'

>>> b = bytearray('abc', 'utf-16-le')
>>> b
bytearray(b'a\x00b\x00c\x00')
>>> b.decode('utf-16-le')
'abc'

Python-3.x相关问答推荐

如何获得给定列表中所有可能的元素组合?

网站抓取:当我使用Chrome DevTools中的网络选项卡时,找不到正确的URL来提供我想要的数据

循环遍历数据框以提取特定值

无法使用Python slack 螺栓SDK读取在 slack 通道中收到的消息

为什么在Python中使用RANDINT函数时会出现此TypeError?

我不能使用拆分来分隔数据

Python VS Code 自动导入路径包含 src

根据按不同列中的值分组的平均值划分 DataFrame

隐藏Cartopy中高纬度非矩形投影的右侧轴(纬度)标签

使用 Python 在特定组的列中设置上限

有效地缩短列表,直到第一次和最后一次出现不同于 None 的值

如何准确测定cv2的结果.在BW/黑白图像中查找对象?

排队多个子进程

smtplib 在 Python 3.1 中发送带有 unicode 字符的邮件的问题

理解 Keras 的 ImageDataGenerator 类中的 `width_shift_range` 和 `height_shift_range` 参数

'~'(波浪号)运算符在 Python 中的应用

使用 pytest.fixture 返回模拟对象的正确方法

Python 3 - Zip 是 pandas 数据框中的迭代器

为什么 Python 不能识别我的 utf-8 编码源文件?

TypeError:无法实例化类型元组;使用 tuple() 代替