🔖
【Python】bytes と bytearray の違い
はじめに
Pythonでバイナリデータを扱うときに出てくる bytes
と bytearray
。
見た目がよく似ていますが、変更できるかどうか(ミュータブルかイミュータブルか) が大きな違いです。
違いのまとめ
データ型 | 説明 | 変更可否 | 主な用途 |
---|---|---|---|
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