Python: リストとタプルの共通点や違い、相互変換方法

Pythonにはコレクションと呼ばれる 「複数のデータをまとめて扱う仕組み」が用意されています。 コレクションはリスト・タプル・ディクショナリ・セットの4種類です。 ここではリストタプルの共通点や違い、さらに相互変換の方法を紹介します。

リストとタプルの共通点

リストとタプルはどちらも「シーケンス」であり「イテラブルなオブジェクト」です。

シーケンス

シーケンスとは「各要素の並びに順序が存在する仕組み」のことです。 つまり要素をインデックスで管理できます。
例えば先頭の要素を取得したい場合、リストは「リスト名[0]」、 タプルは「タプル名[0]」のようにインデックスを使って要素を取得できます。

li = [1, 2, 3]
t = (4, 5, 6)

print(li[0]) # 1
print(t[0])  # 4

イテラブルなオブジェクト

イテラブルなオブジェクトとは 「反復処理(繰り返し処理)が可能なオブジェクト」のことです。
イテラブルなオブジェクトのわかりやすい例として for文の構文を見てみます。

for 変数 in イテラブルなオブジェクト:
	処理

上の「イテラブルなオブジェクト」の部分に、リストもタプルもどちらも使えます。

# リストの場合
for 変数 in [1, 2, 3]:
	処理
	
# タプルの場合
for 変数 in (1, 2, 3):
	処理

リストとタプルの違い

変更可能/変更不可

リストはミューターブル(変更可能)であり、 タプルはイミュータブル(変更不可)な点が大きな違いです。 リストの要素の一部を変更することは可能ですが、 タプルの要素の一部を変更することはできません。

次のコードのように、タプルではインデックスを指定して要素の値を変えることはできません。 要素を増やしたり、減らしたりもできません。

t = (4, 5, 6)

t[0] = 10 # エラー

# 実行結果(エラー)
TypeError: 'tuple' object does not support item assignment

但し、オブジェクトIDを変えることで値の変更は可能です。 つまりタプルを再定義すれば、値を変えたり要素の増減が可能となります。

t = (4, 5, 6)
print(id(t))  # 2260311750720

# 再定義
t = (10, 5, 6)
print(id(t))  # 2260313777280

上のコードではタプルを再定義することで実質的に値を変更しています。 最初の変数 tと再定義後の変数 tのIDが異なっているのが確認できます。

相互変換方法

リストとタプルを相互変換したい場合、それぞれのコンストラクタを使います。 タプルに変換する場合は tuple()コンストラクタ、 リストに変換する場合は list()コンストラクタです。

次のサンプルコードでは、 tuple()とlist()を使って相互変換しています。 type()関数を使って型の確認もしています。

li = [1, 2, 3]
t = (1, 2, 3)

# リストをタプルに変換
print(tuple(li))       # (1, 2, 3)
print(type(tuple(li))) # <class 'tuple'>

# タプルをリストに変換
print(list(t))         # [1, 2, 3]
print(type(list(t)))   # <class 'list'>
Python