Pythonリストとタプルの違いを詳しく説明します。


前言
「リスト(list)とタプル(tuple)の2つのデータの種類にはどのような違いがありますか?」という質問は、初級プログラマの面接でよく見られますが、面接官の予想を超えた答えは多くの印象を与えられます。後の面接もスムーズに進められます。Pythonの基本的なデータ構造の把握程度を調べるために、簡単なタイプの送り問題です。どう答えたら点数を失うことができますか?
同じ点:すべてシーケンスタイプです。
その違いに答える前に、まず両者の共通点を説明します。リストとtupleはシーケンスタイプのコンテナオブジェクトであり、どんな種類のデータを保存してもいいです。スライス、反復などの操作をサポートします。

>>> foos = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> foos[0:10:2]
[0, 2, 4, 6, 8]
>>> bars = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
>>> bars[1:10:2]
(1, 3, 5, 7, 9)
このように操作が似ていますが、Pythonはなぜtupleというタイプをデザインしなければなりませんか?これは彼らの違いから答えを探します。
違い点一:可変VS可変ではない
文字どおりの区別(括弧と括弧)以外に、最も重要な点はtupleは可変タイプで、サイズが固定されていません。listは可変タイプで、データは動的に変化することができます。この違いは両者が提供する方法、応用シーン、性能に大きな違いがあります。
リスト特有の方法:

>>> foo = [2,3,1,9,4]
>>> foo.sort() #   
>>> foo.insert(5,10) #   
>>> foo.reverse() #   
>>> foo.extend([-1, -2]) #   
>>> foo.remove(10) #   
>>> foo.pop() #         
>>> foo.append(5) #   
すべての操作は元のリストに基づいて更新され、tupleは可変ではないデータタイプとして、同じサイズのデータ、初期化と反復tupleはlistより速いです。

>python -m timeit "[1,2,3,4,5]"
10000000 loops, best of 3: 0.123 usec per loop
>python -m timeit "(1,2,3,4,5)"
100000000 loops, best of 3: 0.0166 usec per loop
同じ大きさのデータで、tupleが占有するメモリの空間はもっと少ないです。

>>> foo = tuple(range(1000))
>>> bar = list(range(1000))
>>> foo.__sizeof__()
8024
>>> bar.__sizeof__()
9088
原子的なtupleオブジェクトは辞書のキーとしても使用できます。

>>> foo = (1,(2,3))
>>> d = {foo: 1}
>>> bar = (1, [2,3]) #     tuple,             list
>>> d = {bar: 1}
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
相違点二:異性VS異性
tupleは異性のデータを記憶するために使用され、フィールド名がない記録として使用されます。例えば、tupleで身長、体重、年齢を記録します。

person = ("zhangsan", 20, 180, 80)
たとえば、座標上のある点を記録します。

point = (x, y)
リストは一般的に同じ構造のデータ(homogenous)を格納するために使用されます。同じ構成のデータは以下のような同じ意味のデータです。

["zhangsan", "Lisi", "wangwu"]
また、リストに保存された複数のユーザ記録のようなものである。

[("zhangsan", 20, 180, 80), ("wangwu", 20, 180, 80)]
tupleは名前のない記録として使われているので、シーンによっては限界があります。またnamedtupleタイプの存在があります。namedtupleはフィールド名を指定して、軽量級のクラスとして使用できます。
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。