🔖

【Python】bytes と bytearray の違い

に公開

はじめに

Pythonでバイナリデータを扱うときに出てくる bytesbytearray

見た目がよく似ていますが、変更できるかどうか(ミュータブルかイミュータブルか) が大きな違いです。

違いのまとめ

データ型 説明 変更可否 主な用途
bytes 不変(イミュータブル)なバイト列 ❌ 変更不可 ネットワーク通信・ファイル読み取りなど
bytearray 可変(ミュータブル)なバイト列 ✅ 変更可能 バイナリデータの加工・編集

具体例

bytes(変更不可)

b = b"hello"
print(b[0])  # => 104
b[0] = 72  # ❌ TypeError: 'bytes' object does not support item assignment

bytes は文字列のように扱えますが、内容を変更できません。

bytearray(変更可)

ba = bytearray(b"hello")
ba[0] = 72
print(ba)  # => bytearray(b'Hello')
print(ba.decode())  # => Hello

bytearray はリストのように要素の書き換えが可能です。

補足:型の柔軟性について

型ヒントで bytearray を指定していても、実際には bytes を渡すことができます。

def modify_data(data: bytearray):
    ba = bytearray(data)  # bytes でも bytearray でも受け取れる
    ba[0] = 72
    return ba


b = b"hello"
result = modify_data(b)  # bytes を渡しても OK
print(result)  # => bytearray(b'Hello')

Pythonは動的型付け言語なので、型ヒントは実行時に強制されません。
また、bytearray() のコンストラクタは bytes も受け取れるため、問題なく動作します。

まとめ

  • 変更しないバイナリデータbytes
  • 加工や変換が必要なデータbytearray

ほとんどの場面では bytes が使われますが、
ファイルやネットワークデータを一部書き換える場合は bytearray が便利です。

本記事が参考になれば幸いです。

Discussion