Die Python-Funktion bytearray() erzeugt eine veränderbare Byte-Sequenz — die mutable Schwester von bytes. Sie eignet sich überall dort, wo binäre Daten in-place geändert werden sollen: Buffer für Netzwerk-/Datei-I/O, binäre Protokoll-Builder, Bild-/Audio-Bearbeitung. API-mäßig verhält sich bytearray wie bytes — plus Slot-Zuweisung, append(), extend(), pop() etc.
Einleitung
bytes ist Pythons Standard-Typ für unveränderliche Byte-Sequenzen — wie ein „Binär-String". bytearray ergänzt das um Mutability: Bytes können einzeln überschrieben oder per Slicing ersetzt werden, die Länge kann mit append, extend, pop wachsen oder schrumpfen.
Konstruktor-Varianten:
bytearray()— leerbytearray(n)— n Null-Bytes (Pre-Allokation)bytearray(iterable)— aus Iterable von Integern (0–255)bytearray(string, encoding)— aus String mit Encoding
Anwendungsfälle:
- Netzwerk-Buffer: Empfangene Bytes nach und nach anhängen.
- Binär-Protokoll-Builder: Header schrittweise zusammensetzen.
- In-place-Bearbeitung: XOR-Maske auf jedes Byte anwenden, ohne neue Kopien.
Syntax
bytearray()
bytearray(int) # n Null-Bytes
bytearray(iterable_of_ints) # 0..255
bytearray(string, encoding="utf-8", errors="strict")source Optional: Größe (int), Iterable von Integern, String oder anderes Bytes-artiges Objekt.
encoding Pflicht, wenn source ein String ist.
errors (Optional) Verhalten bei Encoding-Fehlern: "strict" (default), "replace", "ignore".
Rückgabewert
Eine bytearray-Instanz.
Beispiele
Verschiedene Konstruktor-Formen
bytearray() ist sehr flexibel — die wichtigsten Wege auf einen Blick:
print(bytearray())
print(bytearray(5))
print(bytearray([72, 73]))
print(bytearray("Hi", "utf-8"))
print(bytearray(b"raw"))bytearray(b'')
bytearray(b'\x00\x00\x00\x00\x00')
bytearray(b'HI')
bytearray(b'Hi')
bytearray(b'raw')In-place ändern
Anders als bytes lassen sich einzelne Bytes oder Slices direkt zuweisen:
ba = bytearray(b"hello")
ba[0] = ord('H')
ba[1:5] = b"appy "
print(ba)bytearray(b'Happy ')Wachsen lassen
append, extend, += wachsen den Buffer dynamisch — perfekt für Netzwerk-Streaming:
buf = bytearray()
buf.append(0x48)
buf.extend(b"ello")
buf += b"!"
print(buf)bytearray(b'Hello!')Praktische Beispiele
XOR-Maske in-place anwenden
Klassischer Crypto/Obfuscation-Trick: XOR jedes Byte mit einer Maske — bei bytearray ohne Kopien:
data = bytearray(b"secret")
key = 0x42
for i in range(len(data)):
data[i] ^= key
print(data)
# Wieder zurück
for i in range(len(data)):
data[i] ^= key
print(data)bytearray(b'1\'!4#6')
bytearray(b'secret')Streaming-Read mit pre-allokiertem Buffer
In Performance-kritischem Code wird ein Buffer einmal allokiert und immer wieder gefüllt — bytearray macht das einfach:
buf = bytearray(4096)
with open("file.bin", "rb") as f:
while True:
n = f.readinto(buf)
if not n:
break
process(memoryview(buf)[:n])bytes ↔ bytearray konvertieren
Beide Typen sind zueinander kompatibel — Konvertierung ist trivial:
immutable = b"abc"
mutable = bytearray(immutable)
mutable[0] = ord('A')
print(bytes(mutable))b'Abc'Praktische Hinweise
bytesist hashable,bytearraynicht —bytearraykann nicht als Dict-Key dienen.- Performance: In-place-Operationen sind deutlich schneller als das wiederholte Erzeugen neuer
bytes-Instanzen. - Slot-Werte sind ints (0–255) — keine Single-Char-Strings beim Zuweisen.
memoryview(bytearray)liefert einen Zero-Copy-View — perfekt für Bibliotheks-APIs.- Verwandte Typen:
bytes(immutable),memoryview(View),array.array(typisierte Arrays),io.BytesIO(in-memory binärer Stream).