杰瑞科技汇

Python bytearray 长度如何确定?

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

Python bytearray 长度如何确定?-图1
(图片来源网络,侵删)

如何获取 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)字节序列,所以很多操作都会改变它的长度。

Python bytearray 长度如何确定?-图2
(图片来源网络,侵删)

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。

Python bytearray 长度如何确定?-图3
(图片来源网络,侵删)
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 的长度对比

bytearraybytes 在长度处理上非常相似,因为它们都是字节序列。

特性 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 的长度。
分享:
扫描分享到社交APP
上一篇
下一篇