2012-04-02 7 views
7

私はしばらくの間、リストとタプルの主な違いはリストが変更可能であり、タプルはそうではないことが分かっています。それ以外にも、さまざまな方法がありますが、リストやタプルについてはほとんど分かりません。それ以外に違いはありますか? Python 3のリストにタプルを使用する場合、の長所/短所(不変性とは別に)がありますか?より速いアクセス時間を持つか、またはより小さいメモリサイズを持つか、または他の方法より多くの方法を含んでいますか?内部構造はどのように異なっていますか?または、タプルは不変のリストだけですが、何もありません。Pythonのリストとタプルの差(マイナス不変性)?

+0

[リストとタプルの違いは何ですか?](http://stackoverflow.com/questions/626759/whats-the-difference-between-list-and-tuples) –

答えて

7

リストとタプルの両方は、要素オブジェクトへの参照の配列として内部的に実装されています。このようにして、両方を索引付けすることができ、両方とも各要素に同じ量のメモリーを必要とします。内部的には、両方とも均質(型なし参照)です。論理的には、どちらも異種(自動逆参照、型はターゲットオブジェクトにバインドされています)です。

リストは変更可能なので、内部配列は動的配列です。タプルは変更できないので、内部的には固定サイズの配列です。その観点から、タプルは簡単です。

これは速いかどうかで、timeitモジュールを使用して具体的な状況を測定できます。

タプルは、格納されている参照の数と値に関してのみ不変であることに注意してください。タプル要素の1つとしてリストが使用されている場合、リストの内容は変更できます。このように、論理的には、タプルの内容は一定ではありません(そのようなタプルはハッシュ可能ではありません)。

目的に適したタイプを使用してください。厳しい選好はありません。状況によって異なります。

4

両方でdirを実行してください - かなり異なるメソッドリスト(以下に示すpop)。タプルは「ポップ」、「回数」、「拡張」、「インデックス」、「挿入」、「追加」

>>> alist = [1,2,3] 
>>> atuple = (1,2,3) 
>>> alist.pop() 
3 
>>> atuple.pop() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'tuple' object has no attribute 'pop' 

速いかもしれ、「削除」、「リバース」、「ソート」、すべての利用可能です不変性を考えれば、タプルは意味がない。

哲学的には、リストは同質であると予想され、タプルの期待はありません。

+0

内部的な違いはありますか?構造体やエンコーディングなどの型? – fouric

+0

文字列のエンコーディングを意味するなら、それはタプルと無関係です。エンコーディングは、抽象文字列を具体的なバイトシーケンスに変換する方法です。タプルに文字列要素が含まれている場合、文字列オブジェクトはタプルの外側に作成されます。タプル要素はオブジェクト(型なし参照)のみを参照します。これはタプル要素またはリスト要素の両方で同じです。 – pepr

関連する問題