Python bytearray Function
Last modified April 11, 2025
This comprehensive guide explores Python's bytearray
function, which
creates a mutable sequence of bytes. We'll cover creation methods, manipulation
techniques, and practical examples of working with binary data.
Basic Definitions
The bytearray
function returns a mutable array of bytes. Unlike
bytes
objects, bytearray
can be modified after
creation.
Key characteristics: mutable sequence of integers (0-255), supports common sequence operations, and can be converted to/from bytes and strings with specified encodings.
Creating bytearray Objects
Here are different ways to create bytearray
objects using various
source types and initialization methods.
# 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')
This example shows five creation methods. The first creates an empty bytearray. The second converts integers to corresponding bytes. The third copies bytes.
The fourth demonstrates string encoding conversion. The fifth creates a pre-sized bytearray filled with null bytes. All methods produce mutable objects.
Modifying bytearray Content
This example demonstrates how to modify a bytearray by changing individual bytes, slicing, and using various methods.
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!')
The example shows various mutation operations. We modify single bytes using indexing, replace slices, extend with new bytes, insert at positions, and delete bytes.
All operations happen in-place since bytearray is mutable. This differs from bytes objects which would require creating new objects for each change.
Working with Encodings
Bytearrays often interact with text encodings. This example shows conversion between strings and bytearrays with different encodings.
# 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')
The example demonstrates encoding conversions. We create bytearrays from Unicode strings using UTF-8 and Latin-1 encodings, then decode back to strings.
The fromhex
method shows creating bytearrays from hexadecimal
representations. Note how different encodings handle non-ASCII characters
differently.
Binary Data Manipulation
Bytearrays are ideal for binary data processing. This example shows practical binary operations like bit manipulation and file 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
This demonstrates low-level binary operations. We perform bit masking and XOR operations directly on bytearray elements. The example also shows file I/O.
Bytearrays are particularly useful for protocols and formats where you need to modify binary data after reading it from a file or network connection.
Performance Comparison
This example compares bytearray performance with alternatives like bytes and lists for common operations.
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))
The benchmark shows bytearray's efficiency for mutable byte operations. It's optimized for this use case compared to alternatives like lists of integers.
For read-only operations, bytes objects would be faster, but bytearray provides the best balance when mutability is required.
Best Practices
- Use for mutable data: When you need to modify binary data after creation
- Prefer bytes for constants: Immutable data should use bytes objects
- Specify encodings: Always explicitly specify encodings when converting text
- Consider memoryview: For zero-copy slicing of large bytearrays
- Handle errors: Use error handlers when decoding uncertain data
Source References
Author
List all Python tutorials.