Python bytearray 函数
上次修改时间:2025 年 4 月 11 日
本综合指南探讨了 Python 的 bytearray
函数,该函数创建一个可变的字节序列。我们将介绍创建方法、操作技巧以及使用二进制数据的实际示例。
基本定义
bytearray
函数返回一个可变的字节数组。与 bytes
对象不同,bytearray
对象在创建后可以被修改。
主要特点:可变的整数序列 (0-255),支持常见的序列操作,并且可以使用指定的编码在字节和字符串之间进行转换。
创建 bytearray 对象
以下是使用各种源类型和初始化方法创建 bytearray
对象的不同方式。
# Empty bytearray empty = bytearray() print(empty) # bytearray(b'') # From iterable of integers nums = bytearray([65, 66, 67]) print(nums) # bytearray(b'ABC') # From bytes object original = b'hello' mutable = bytearray(original) print(mutable) # bytearray(b'hello') # From string with encoding text = bytearray('Python', 'utf-8') print(text) # bytearray(b'Python') # With size and fill value zeros = bytearray(5) print(zeros) # bytearray(b'\x00\x00\x00\x00\x00')
此示例展示了五种创建方法。第一个创建一个空的 bytearray。第二个将整数转换为相应的字节。第三个复制字节。
第四个演示了字符串编码转换。第五个创建一个预先确定大小的 bytearray,并用空字节填充。所有方法都会生成可变对象。
修改 bytearray 内容
此示例演示了如何通过更改单个字节、切片和使用各种方法来修改 bytearray。
data = bytearray(b'Hello World') # Modify single byte data[0] = 74 # 'J' print(data) # bytearray(b'Jello World') # Modify slice data[6:11] = b'Python' print(data) # bytearray(b'Jello Python') # Append bytes data.extend(b'!') print(data) # bytearray(b'Jello Python!') # Insert bytes data.insert(5, 32) # space print(data) # bytearray(b'Jello Python!') # Remove bytes del data[0] print(data) # bytearray(b'ello Python!')
该示例展示了各种变异操作。我们使用索引修改单个字节,替换切片,使用新字节扩展,在位置插入,以及删除字节。
由于 bytearray 是可变的,因此所有操作都在原地进行。 这与 bytes 对象不同,后者需要为每个更改创建新对象。
使用编码
Bytearray 经常与文本编码交互。 此示例显示了使用不同编码的字符串和 bytearray 之间的转换。
# String to bytearray text = "Привет" utf8 = bytearray(text, 'utf-8') print(utf8) # bytearray(b'\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82') # Bytearray to string decoded = utf8.decode('utf-8') print(decoded) # Привет # Different encodings latin1 = bytearray(text, 'latin1', errors='replace') print(latin1) # bytearray(b'??????') # Hex representation hex_data = bytearray.fromhex('48656c6c6f') print(hex_data) # bytearray(b'Hello')
该示例演示了编码转换。 我们使用 UTF-8 和 Latin-1 编码从 Unicode 字符串创建 bytearray,然后解码回字符串。
fromhex
方法展示了如何从十六进制表示创建 bytearray。请注意不同的编码如何以不同的方式处理非 ASCII 字符。
二进制数据操作
Bytearray 非常适合二进制数据处理。此示例显示了实际的二进制操作,例如位操作和文件 I/O。
# Create sample binary data data = bytearray([0b01010101, 0b10101010]) # Bitwise operations data[0] &= 0b00001111 # Mask upper bits print(bin(data[0])) # 0b101 # XOR operation data[1] ^= 0b11111111 print(bin(data[1])) # 0b1010101 # File operations with open('binary.dat', 'wb') as f: f.write(data) with open('binary.dat', 'rb') as f: loaded = bytearray(f.read()) print(loaded == data) # True
这演示了低级二进制操作。我们直接对 bytearray 元素执行位掩码和 XOR 操作。 该示例还显示了文件 I/O。
Bytearray 特别适用于协议和格式,在这些协议和格式中,您需要在从文件或网络连接读取二进制数据后对其进行修改。
性能比较
此示例将 bytearray 的性能与 bytes 和列表等替代方案在常见操作中的性能进行比较。
import timeit def test_bytearray(): data = bytearray(1000) for i in range(len(data)): data[i] = i % 256 def test_bytes(): data = bytes(1000) # Can't modify - would need to create new objects def test_list(): data = [0] * 1000 for i in range(len(data)): data[i] = i % 256 print("bytearray:", timeit.timeit(test_bytearray, number=1000)) print("list:", timeit.timeit(test_list, number=1000))
基准测试表明 bytearray 对于可变字节操作的效率。 与整数列表等替代方案相比,它针对此用例进行了优化。
对于只读操作,bytes 对象会更快,但 bytearray 在需要可变性时提供最佳平衡。
最佳实践
- 用于可变数据: 当您需要在创建后修改二进制数据时
- 常量首选 bytes: 不可变数据应使用 bytes 对象
- 指定编码: 在转换文本时始终显式指定编码
- 考虑 memoryview: 用于大型 bytearray 的零拷贝切片
- 处理错误: 解码不确定的数据时使用错误处理程序
资料来源
作者
列出所有 Python 教程。