bytearray 是 Python 中一个可变的字节序列,这意味着你可以在创建后修改它,包括添加、删除或修改其中的字节,这与不可变的 bytes 类型形成鲜明对比。
以下是向 bytearray 添加数据的主要方法,从最常用到更高级的用法。
核心方法:extend()
这是最常用、最直接的方法,用于向 bytearray 的末尾添加一个可迭代对象(另一个 bytearray、bytes 对象、整数列表等)。
语法:
bytearray.extend(iterable)
特点:
extend()方法会就地修改原bytearray对象,不会返回新的对象。- 它可以接受任何可迭代对象,只要其中的元素是 0-255 范围内的整数。
示例详解
使用 extend() 添加 bytes 对象
这是最常见的用法,你可以将一个 bytes 对象的内容追加到 bytearray 的末尾。
# 创建一个初始的 bytearray
ba = bytearray(b'Hello, ')
print(f"初始内容: {ba}") # 输出: 初始内容: bytearray(b'Hello, ')
# 要添加的 bytes 对象
to_add = b'World!'
# 使用 extend() 添加
ba.extend(to_add)
print(f"添加后内容: {ba}") # 输出: 添加后内容: bytearray(b'Hello, World!')
使用 extend() 添加另一个 bytearray
bytearray 本身也是可迭代的,所以可以直接添加另一个 bytearray 的内容。
ba1 = bytearray(b'Python ') ba2 = bytearray(b'is fun!') ba1.extend(ba2) print(ba1) # 输出: bytearray(b'Python is fun!')
使用 extend() 添加整数列表
extend() 的强大之处在于它可以接受一个整数列表,每个整数代表一个字节(必须在 0-255 范围内)。
ba = bytearray(b'Value: ') # 添加字节 65, 66, 67 (它们分别是 'A', 'B', 'C' 的 ASCII 码) ba.extend([65, 66, 67]) print(ba) # 输出: bytearray(b'Value: ABC')
错误情况:添加超出范围的整数
extend() 接收的整数列表中有超出 0-255 范围的数字,会抛出 ValueError。
ba = bytearray(b'Test ')
try:
# 尝试添加一个无效的值 256
ba.extend([1, 2, 256, 3])
except ValueError as e:
print(f"发生错误: {e}") # 输出: 发生错误: byte must be in range(0, 256)
其他添加方法
虽然 extend() 是最推荐的,但还有其他几种方式可以实现类似的效果,各有其适用场景。
使用 运算符
运算符也可以用来追加 bytes 或 bytearray,它的行为类似于 extend(),是就地修改的。
ba = bytearray(b'Start ') # 使用 += 追加 bytes ba += b'End' print(ba) # 输出: bytearray(b'Start End') # 注意:不能直接 += 一个列表,会报 TypeError # ba += [65, 66] # TypeError: can only concatenate bytes (not "list") to bytes
使用 append() 方法
如果你只想添加单个字节,append() 是一个更清晰、更高效的选择。
语法:
bytearray.append(value)
特点:
- 只接受一个整数参数(0-255)。
- 比用
extend([value])更直接。
ba = bytearray(b'Appended: ') # 添加单个字节 ba.append(88) # 88 是 'X' 的 ASCII 码 ba.append(89) # 89 是 'Y' 的 ASCII 码 print(ba) # 输出: bytearray(b'Appended: XY')
使用切片赋值 ba[len(ba):] = ...
这是一种更底层但非常灵活的方法,你可以通过赋值给一个“空切片”(即从末尾开始的切片)来添加数据。
ba = bytearray(b'Slice ') # 通过切片赋值添加 bytes ba[len(ba):] = b'Add' print(ba) # 输出: bytearray(b'Slice Add') # 通过切片赋值添加整数列表 ba[len(ba):] = [1, 2, 3] print(ba) # 输出: bytearray(b'Slice Add\x01\x02\x03')
这种方法功能强大,但可读性不如 extend(),在日常编码中较少使用。
方法对比与选择
| 方法 | 语法 | 描述 | 适用场景 |
|---|---|---|---|
extend() |
ba.extend(iterable) |
推荐,将一个可迭代对象的所有元素追加到末尾。 | 追加多个字节,无论是来自 bytes、bytearray 还是整数列表。 |
ba += bytes_data |
功能与 extend() 类似,用于追加 bytes 或 bytearray。 |
简单追加 bytes 或 bytearray,代码风格更简洁。 |
|
append() |
ba.append(integer) |
追加单个字节。 | 当你明确知道只需要添加一个字节时,这是最清晰、最高效的选择。 |
| 切片赋值 | ba[len(ba):] = data |
通过赋值来修改或添加字节。 | 高级用法,非常灵活,但可读性稍差。 |
- 追加多个字节:首选
bytearray.extend()方法,因为它最通用、最清晰。 - 追加单个字节:使用
bytearray.append()方法,它更直接。 - 快速追加
bytes:可以使用 运算符,代码更简短。 - 记住:
bytearray是可变的,这些操作都会直接修改原始对象,而不是创建一个新的。
