Pythonのタプルはミュータブルではない?要素の追加・変更・削除ができない理由を解説

Oracle

Pythonにはリストや辞書、タプルなど複数のデータ型があります。それぞれ性質が異なり、特にタプルについては「作成後に内容を変更できるのか」「ミュータブルなデータ型なのか」という点で混乱しやすい部分です。この記事では、Pythonのタプルの特徴やミュータブル・イミュータブルの違い、実際の操作例を交えながら詳しく解説します。

Pythonのタプルはイミュータブルなデータ型

Pythonのタプル(tuple)は、作成した後に要素を追加・変更・削除できないイミュータブル(immutable)なデータ型です。

つまり、タプルを一度作成すると、その中に保存されている値の並びを直接変更することはできません。リスト(list)のように後から値を追加したり、特定の要素を書き換えたりすることはできません。

例えば、以下のようなタプルを作成した場合を考えます。

numbers = (1, 2, 3)

このタプルの2番目の要素を変更しようとしても、エラーが発生します。

numbers[1] = 10

実行すると「TypeError: ‘tuple’ object does not support item assignment」というエラーになり、タプルの要素変更ができないことが分かります。

ミュータブルとイミュータブルの違い

Pythonのデータ型は、大きく分けるとミュータブル(mutable)とイミュータブル(immutable)の2種類があります。

ミュータブルとは、作成後に内容を変更できるデータ型のことです。一方、イミュータブルとは、一度作成したオブジェクトの内容を変更できないデータ型を指します。

種類 変更可能か 代表的な型
ミュータブル 可能 list、dict、set
イミュータブル 不可能 tuple、str、int

例えばリストの場合は、以下のように作成後に要素を変更できます。

numbers = [1, 2, 3]
numbers[1] = 10

この場合、リストの内容は「[1, 10, 3]」に変化します。しかし、同じ操作をタプルで行うことはできません。

タプルに要素を追加や削除することはできるのか

タプルには、リストで使用できるappend()やremove()のようなメソッドはありません。そのため、作成後に要素を追加したり削除したりすることはできません。

例えば、以下のような処理はエラーになります。

data = ("apple", "banana")
data.append("orange")

このような変更操作が必要な場合は、一度リストに変換してから操作する方法があります。

data = ("apple", "banana")
list_data = list(data)
list_data.append("orange")

この場合、元のタプルを変更しているのではなく、新しく作成したリストを変更しています。

タプルを変更したように見える処理の仕組み

タプルは変更できませんが、別の値を持つ新しいタプルを作成することは可能です。

例えば、以下のコードではタプルに要素を追加したように見えます。

numbers = (1, 2, 3)
numbers = numbers + (4,)

しかし実際には、元のタプルに4を追加しているわけではありません。元のタプルとは別に「(1, 2, 3, 4)」という新しいタプルを作成し、変数numbersが新しいオブジェクトを参照するようになっています。

この仕組みが、タプルがイミュータブルである理由の一つです。

Pythonでタプルを使うメリット

タプルは変更できないという制限がありますが、その性質によってさまざまなメリットがあります。

例えば、プログラム内で変更されたくない設定値や固定されたデータを管理するときに適しています。誤って値を書き換えてしまうリスクを減らせるため、安全性の高いコードを書くことができます。

また、タプルはリストよりも変更されないことが保証されるため、辞書のキーとして利用できる場合があります。

例えば、位置情報や座標など「常に同じ組み合わせで扱いたいデータ」はタプルで管理すると分かりやすくなります。

まとめ

Pythonのタプルはミュータブルなデータ型ではなく、作成後に要素を変更できないイミュータブルなデータ型です。

要素の追加・変更・削除は直接行えませんが、必要な場合は新しいタプルを作成したり、一時的にリストへ変換して操作したりできます。

リストは変更するデータ、タプルは変更したくない固定データというように使い分けることで、Pythonのコードをより安全で分かりやすく管理できます。

コメント

タイトルとURLをコピーしました