Python のリスト list と
タプル tuple の違いってなに?

リストは変更できる。
タプルは変更できない。

機能的な違い

変更できない

リストは変更できるので、問題なくこれが実行できますが

lst = [0, 1, 2]
lst[0] = 3

タプルは変更できないので、変更しようとすると TypeError になります。

tpl = (0, 1 , 2)
tpl[0] = 3  # TypeError
>>> tpl[0] = 3
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
>>> 

「変更できない」と言うのを難しい言葉でイミュータブル immutable と言います。 タプル tuple はイミュータブル immutable です。

「変更できる」と言うのを難しい言葉でミュータブル mutable と言います。 リスト list はミュータブル mutable です。

メソッドの数の違い

タプルは変更できないのでメソッドが、たったの2つしかありません。

print(*(attr for attr in dir(tuple) if '__' not in attr ), sep="\n")
>>> print(*(attr for attr in dir(tuple) if '__' not in attr ), sep="\n")
count
index
>>> 

反対にリストは変更できるため、その操作に合わせてメソッドがたくさんあります。

print(*(attr for attr in dir(list) if '__' not in attr ), sep="\n")
>>> print(*(attr for attr in dir(list) if '__' not in attr ), sep="\n")
append
clear
copy
count
extend
index
insert
pop
remove
reverse
sort
>>> 

変更できないことに意味があるのか?

ざっくり言えば、可読性と安全性が上がります。 変更ができない、副作用のないことは一般に可読性と安全性をあげると言われています。 たかだか変更できないくらいのことに、どれくらいの意味があるのか、以下の記事でご紹介させていただきました。

タプルとリストの使い分けは?

上記の理由から、変更する必要がない場合は、タプル tuple が使える時には、タプル tuple を使うべきだと考えます。

タプルの元々の意味、意図

tuple は、言うなればユーザ定義クラスの一種です。 わざわざユーザ定義クラスを作るほどではないなという時に使います。  タプルtuple  で厳しくなったら  辞書dict  を用います。 辞書 dict でも厳しくなったら  ユーザ定義クラス class   を定義します。

# 1. タプルの本来の意味(タプルから辞書、辞書からクラス)
class Person(object):
    def __init__(self, name, age):
        self.name, self.age = name, age

person1 = ('岩倉玲音', 14)                 # 1. tuple
person2 = {'name': '岩倉玲音', 'age': 14}  # 2. dict
person3 = Person('岩倉玲音', 14)           # 3. class

person1[0]                                 # 1. tuple
person2['name']                            # 2. dict
person3.name                               # 3. class
# 2. タプルの本来の意味(リストとタプルの使い分け)
#      素因数分解をする関数
def factorize(n):
    fct = []
    b, e = 2, 0  # base, exponent
    while b * b <= n:
        while n % b == 0:
            n = n // b
            e = e + 1
        if e > 0:
            # わざわざタプルや辞書にするまでもないのでタプル
            fct.append((b, e))
        b, e = b + 1, 0
    if n > 1:
        fct.append((n, 1))
    return fct

factorize(2**7 * 3**2 * 5**4 * 7**8)

タプル - Wikipedia
タプルまたはチュープル(英: tuple)とは、複数の構成要素からなる組を総称する一般概念。

なぜタプルとリストという別のデータ型が用意されているのですか?
 リストとタプルは 、 多くの点で似ていますが、一般には本質的に  異なる方法で使われます  タプルは、Pascal のレコードや C の構造体と同様なものと考えられます。  型が異なっても良い関連するデータの小さな集合で、グループとして演算されます。 例えば、デカルト座標は 2 つや 3 つの数のタプルとして適切に表せます。

一方、 リストは、もっと他の言語の配列に近いものです。  全て同じ型の可変数のオブジェクトを持ち、それらが一つ一つ演算される傾向にあります。 例えば、 os.listdir('.') はカレントディレクトリ内にあるファイルの文字列表現のリストを返します。 この出力を演算する関数は一般に、ディレクトリに一つや二つの別のファイルを加えても壊れません。

ABC 言語の Compounds 型に由来しているらしいです。 PUT value IN name で代入になります。 lst[0] のような添字表記 subscription で参照することはできなかったみたいです。

Compounds - ABC: Some Simple Examples

Compounds are like records or structures, but without field names:

>>> PUT ("Square root of 2", root 2) IN c
>>> WRITE c
("Square root of 2", 1.414213562373095)
>>> PUT c IN name, value
>>> WRITE name
Square root of 2
>>> WRITE value
1.414213562373095

書籍 Fluent Python 2.11 参考文献の末尾にあった「タプルの秘密」から知りました。

こうした制限は、コンパウンド型の主たる目的を明確にしています。 つまりそれは、フィールド名のないただのレコードではないか。 私はそうGuidoに話しました。 彼は「タプルをシーケンスみたいに動作させるようにするのはハックだったよ」と答えました。
タプルの秘密 - Fluent Python

まとめ

タプルはイミュータブルなリストです。 イミュータブルにすることは、 コードの可読性や安全性を向上させます。

また Python の tuple は簡易的なクラスを作成することを意図していた ABC 言語の Compounds 型に由来しています。