bytearray 的长度指的是它所包含的字节数,你可以通过内置函数 len() 来获取它的长度,就像获取列表、元组等其他序列类型的长度一样。

如何获取 bytearray 的长度
使用 len() 函数是最直接、最常用的方法。
示例代码:
# 创建一个空的 bytearray
ba_empty = bytearray()
print(f"空 bytearray 的长度: {len(ba_empty)}") # 输出: 0
# 使用字符串初始化,并指定编码 (通常是 'utf-8')
ba_str = bytearray("Hello, 世界", 'utf-8')
print(f"字符串初始化的长度: {len(ba_str)}") # 输出: 13 (H,e,l,l,o,,, ,世,界)
# 使用整数列表初始化
ba_list = bytearray([65, 66, 67, 68]) # A, B, C, D 的 ASCII 码
print(f"列表初始化的长度: {len(ba_list)}") # 输出: 4
# 使用 bytes 对象初始化
ba_bytes = bytearray(b'ABCD')
print(f"bytes 对象初始化的长度: {len(ba_bytes)}") # 输出: 4
核心要点:
len(ba) 的时间复杂度是 O(1),因为它直接返回 bytearray 对象内部存储的长度属性,而不是去遍历整个对象,这使得获取长度非常高效。
影响 bytearray 长度的操作
bytearray 是一个可变的(mutable)字节序列,所以很多操作都会改变它的长度。

a) 添加元素
使用 append() 方法会在末尾添加一个字节,从而使长度增加 1。
ba = bytearray(b'ABC')
print(f"初始长度: {len(ba)}") # 输出: 3
ba.append(68) # 添加 'D' 的 ASCII 码
print(f"append 后的长度: {len(ba)}") # 输出: 4
使用 extend() 方法可以在末尾添加多个字节,长度会增加相应的数量。
ba = bytearray(b'AB')
print(f"初始长度: {len(ba)}") # 输出: 2
ba.extend(b'CDE') # 添加 bytes 对象
print(f"extend 后的长度: {len(ba)}") # 输出: 5
使用 或 extend() 效果类似。
ba = bytearray(b'XY')
ba += b'Z'
print(f"使用 += 后的长度: {len(ba)}") # 输出: 3
b) 插入元素
使用 insert() 方法会在指定位置插入一个字节,长度也会增加 1。

ba = bytearray(b'AC')
print(f"初始长度: {len(ba)}") # 输出: 2
ba.insert(1, 66) # 在索引 1 的位置插入 'B' 的 ASCII 码
print(f"insert 后的长度: {len(ba)}") # 输出: 3
print(f"最终内容: {ba}") # 输出: bytearray(b'ABC')
c) 删除元素
使用 del 语句或 pop()、remove() 方法会移除元素,从而使长度减少。
del ba[i]: 删除索引i处的字节,长度减 1。ba.pop(): 移除并返回最后一个字节,长度减 1。ba.remove(x): 移除第一个值为x的字节,长度减 1。
ba = bytearray(b'ABCD')
print(f"初始长度: {len(ba)}") # 输出: 4
del ba[0] # 删除 'A'
print(f"del 后的长度: {len(ba)}") # 输出: 3
last_byte = ba.pop()
print(f"pop 后的长度: {len(ba)}") # 输出: 2
print(f"被 pop 的字节: {last_byte}") # 输出: 68 ('D')
ba.remove(66) # 删除 'B'
print(f"remove 后的长度: {len(ba)}") # 输出: 1
d) 切片赋值
通过切片赋值可以一次性替换、添加或删除多个元素,从而灵活地改变长度。
ba = bytearray(b'ABCDEFG')
print(f"初始长度: {len(ba)}") # 输出: 7
# 替换
ba[1:3] = b'XY' # 用 2 个字节替换 2 个字节
print(f"替换后长度: {len(ba)}") # 输出: 7 (内容: b'AXYCDEFG')
# 添加
ba[2:2] = b'123' # 在索引 2 处插入 3 个字节
print(f"添加后长度: {len(ba)}") # 输出: 10 (内容: b'AX123YCDEFG')
# 删除
ba[4:7] = b'' # 用空字节替换 3 个字节,相当于删除
print(f"删除后长度: {len(ba)}") # 输出: 7 (内容: b'AX12DEFG')
bytearray 长度的限制
bytearray 的长度受限于 Python 解释器可以处理的最大大小,这个最大值通常是系统虚拟内存的大小。
- 32 位 Python: 最大长度约为 2³² - 1 字节 (约 4GB)。
- 64 位 Python: 理论上最大长度可以达到 2⁶⁴ - 1 字节,但实际会受到可用内存的限制。
如果你尝试创建一个超过内存限制的 bytearray,Python 会抛出 MemoryError。
与 bytes 的长度对比
bytearray 和 bytes 在长度处理上非常相似,因为它们都是字节序列。
| 特性 | bytearray |
bytes |
|---|---|---|
| 可变性 | 可变 (Mutable) | 不可变 (Immutable) |
| 长度获取 | len(ba) |
len(bs) |
| 长度修改 | 可以通过各种方法修改 | 不能修改,任何修改操作都会返回一个新的 bytes 对象 |
示例对比:
# bytes 是不可变的
bs = b'Hello'
print(f"bytes 的长度: {len(bs)}") # 输出: 5
# 尝试修改 bytes 会导致错误
# bs[0] = 72 # TypeError: 'bytes' object does not support item assignment
# bytearray 是可变的
ba = bytearray(b'Hello')
print(f"bytearray 的长度: {len(ba)}") # 输出: 5
ba[0] = 72 # 这是允许的
print(f"修改后的 bytearray: {ba}") # 输出: bytearray(b'Hello')
- 获取长度: 使用
len(your_bytearray),这是最高效的方式。 - 改变长度: 通过
append(),extend(),insert(),del,pop(),remove()以及切片赋值等操作可以动态地增加或减少bytearray的长度。 - 核心特性:
bytearray的可变性是其与bytes最根本的区别,也是其长度可以动态变化的原因。 - 性能: 获取长度是 O(1) 操作,非常快,修改长度的操作(如插入、删除)通常需要移动内存中的元素,因此是 O(N) 操作,N 是
bytearray的长度。
