ZetCode

Python bytearray 函数

上次修改时间:2025 年 4 月 11 日

本综合指南探讨了 Python 的 bytearray 函数,该函数创建一个可变的字节序列。我们将介绍创建方法、操作技巧以及使用二进制数据的实际示例。

基本定义

bytearray 函数返回一个可变的字节数组。与 bytes 对象不同,bytearray 对象在创建后可以被修改。

主要特点:可变的整数序列 (0-255),支持常见的序列操作,并且可以使用指定的编码在字节和字符串之间进行转换。

创建 bytearray 对象

以下是使用各种源类型和初始化方法创建 bytearray 对象的不同方式。

create_bytearray.py
# 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。

modify_bytearray.py
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 之间的转换。

encodings.py
# 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。

binary_ops.py
# 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 和列表等替代方案在常见操作中的性能进行比较。

performance.py
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 在需要可变性时提供最佳平衡。

最佳实践

资料来源

作者

我的名字是 Jan Bodnar,我是一位充满热情的程序员,拥有丰富的编程经验。 我从 2007 年开始撰写编程文章。到目前为止,我已经撰写了超过 1,400 篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有 Python 教程