Pythonでは、リストと私が知っているタプルの唯一の違いは、「リストは変更可能ですが、タプルは変更可能ではない」ということです。しかし、私が信じている限り、それはコーダーが可変性のリスクを冒したいかどうかに依存します。
そのため、リストに対してタプルを使用する必要がある場合があるかどうか疑問に思いました。リストでは実行できないが、タプルでは実行できることはありますか?
辞書のキーとしてタプルを使用し、セットにタプルを挿入できます。
>>> {}[tuple()] = 1
>>> {}[list()] = 1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
これは基本的に、ハッシュ可能であるのtuple
にハッシュ可能でlist
はない結果です。
>>> hash(list())
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
>>> hash(tuple())
3527539
@Ottoの答えはとても良いです。私がそれに追加しなければならない唯一のことは、サードパーティの拡張機能まで物事を開くとき、あなたは本当にドキュメントを参照する必要があるということです。一部の関数/メソッドは、いずれかのデータ型を予期する場合があります(または、どちらを使用するかによって結果が異なります)。1つの例は、タプル/リストを使用してnumpy配列にインデックスを付けることです。
import numpy as np
a=np.arange(50)
a[[1,4,8]] #array([1, 4, 8])
a[(1,4,8)] #IndexError
編集
また、クイックタイミングテストは、タプルの作成がリストの作成よりもはるかに高速であることを示しています。
import timeit
t=timeit.timeit('[1,2,3]',number=10000000)
print (t)
t=timeit.timeit('(1,2,3)',number=10000000)
print (t)
これは覚えておくとよいでしょう。言い換えれば、次のことを行います。
for num in (8, 15, 200):
pass
それ以外の:
for num in [8, 15, 200]:
pass
また、%
演算子を使用した廃止された文字列フォーマットでは、引数リストがタプルである必要があります。リストは単一の引数として扱われます。
>>> "%s + %s" % [1, 2]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: not enough arguments for format string
>>> "%s + %s" % (1, 2)
'1 + 2'