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 教程。