🔖
【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
動的型付き言語だからというよりも type hint は IDE に向けているものなので とかそっちな気がします。(言語仕様的な意味で
いや、 type hint の仕様として 「動的型付け言語なので これを 必須にするつもりはない」とあるので間違ってはいないのか……?