2012-09-13 8 views
5

リストをタプルよりも好きにする理由があるのか​​、それとも逆であるのかは、Python ifという文では分かりません。したがって、以下は機能的には同等ですが、パフォーマンスやコーディングスタイルの点で他のものよりも好ましいか、それとも重要ではありませんか? Pythonのif文でリストとタプルを使う

if x in (1,2,3): 
    foo() 

if x in [1,2,3]: 
    foo() 

私は、私は私の経験でタプルが短いとリスト長くする傾向があるためだと思うもはや何のための2つのまたは3の値とリストがある場合タプルを使用しての習慣を身に得ているように見えるが、これはそうですビットは恣意的であり、おそらく不必要に矛盾します。

私は、人々が他のものよりも優れている場所を与えることができる例に興味があります。

乾杯

+3

がここに設定されています – GP89

+0

[リストとタプルの違い]の可能性があります(http://stackoverflow.com/questions/626759/whats-the-difference-between-list-and-tuples-in-python )または[python list対タプルを使うときはいつも](http://stackoverflow.com/questions/1708510/python-list -vs-tuple-when-to-use-each)。 – DSM

+0

@ GP89:詳しく教えてください。 – voithos

答えて

5

でアレイと同様、均質なコレクションのためであるがより少ないバイトコードを生成しますlistよりも - それは本当に心配するものではありません。私はメンバーシップのテストはほぼ同じだと考えています(テストはしていませんが)。

純粋にメンバシップテストの場合、ルックアップのセマンティクスは同じです。以降はPython 2.7からは、それは書くために非常に良くだ(と、それが唯一のメンバーシップのテストだという意味を追加します):

if x in {1, 2, 3}: 
    pass # do something 

その前にしながら:

if x in set([1,2,3]): 
    pass # do something 

はほんの少しクルージ的に見えた...

+0

ありがとうございました。正直言って、2.7で '{}'を使ってセットを作ることはできませんでした。なぜなら、メンバーシップテストの意味ははるかに満足です! – redrah

+1

私はいくつかのタイミングをとり、セットリテラルのメンバシップのテストがタプルリテラルのメンバシップのテストより遅いことを発見しました。これはおそらく、セットを作成するのにかかる時間が原因です。セットリテラルが長くなればなるほど、テストされた項目がセットのメンバーでなくてもパフォーマンスが悪化しました。テイクアウェイは、メンバーシップを一度だけテストするセットを作成しようとするなら、タプルを使うほうが良いということです。複数回テストする必要がある場合は、そのセットが優先されます。 –

+1

@StevenRumbalski、あなたがそれをテストしてうれしい - 私はそれほど疑わしい。キーは、Jon Clementsが上で述べたように、「タプルの初期化(少なくともCPythonでは)は、リストよりもバイトコードが少なくなる」ということです。セットよりもタプルを生成するのに時間がかかるだけではありません。タプルはコンパイル時に一度しか生成されず、その後、[折り畳まれて](http://en.wikipedia.org/wiki/Constant_folding)バイトコードに定数として生成されます。もちろん、タプルは不変であるため可能です。しかし、もう一つの複雑さがあります:タプルに可変値が含まれていれば、定数フォールディングは起こりません。 – senderle

0

リストとタプルの違いは、リストは変更可能であり、タプルは不変であるということです。

tuple(少なくともCPythonの中)の初期化を人々がCで構造体と同様異種コレクションのためのタプルを使用する傾向があり、リストはC.

関連する問題