20

Pythonでは、リストと私が知っているタプルの唯一の違いは、「リストは変更可能ですが、タプルは変更可能ではない」ということです。しかし、私が信じている限り、それはコーダーが可変性のリスクを冒したいかどうかに依存します。

そのため、リストに対してタプルを使用する必要がある場合があるかどうか疑問に思いました。リストでは実行できないが、タプルでは実行できることはありますか?

4

3 に答える 3

30

辞書のキーとしてタプルを使用し、セットにタプルを挿入できます。

>>> {}[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
于 2012-07-09T16:14:27.920 に答える
13

@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
于 2012-07-09T16:34:01.223 に答える
4

また、%演算子を使用した廃止された文字列フォーマットでは、引数リストがタプルである必要があります。リストは単一の引数として扱われます。

>>> "%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'
于 2012-07-10T01:04:09.110 に答える