Pythonの学習中に、こんな違いに気づきました。
アンパック代入は要素数が合っていないとエラーになるのに、zip関数はそうじゃない…?
これって何が違うんだろう?
自分なりに調べてみた内容を、Python初心者向けにまとめてみます。
アンパック代入とは?
まず、アンパックとは「リストやタプルなどの中身を複数の変数に一度に代入する書き方」です。
a, b, c = [1, 2, 3]
print(a, b, c) # 1 2 3
しかし、右辺の要素数と左辺の変数の数が一致していないとエラーになります。
a, b, c, d = "aiu" # 要素が3つしかない
# 実行結果(エラー)
ValueError: not enough values to unpack (expected 4, got 3)
このように、アンパックは**「個数がぴったり一致している」ことが絶対条件**です。
zip関数とは?
一方で、zip関数は「複数のイテラブル(例:リスト、文字列など)をまとめて処理するための関数」です。
list(zip([1, 2, 3], ['a', 'b', 'c']))
# 実行結果
[(1, 'a'), (2, 'b'), (3, 'c')]
要素数が合ってなくてもOK!
list(zip([1, 2, 3], ['a', 'b']))
# 実行結果(エラーなし)
[(1, 'a'), (2, 'b')]
zipは、一番短いイテラブルに合わせて出力してくれます。
この仕様のおかげで、アンパックとは違って要素数のズレでエラーになることがありません。
for文での使い方も比較してみる
アンパックでエラーになる例
a, b = [1, 2, 3] # 変数が2つなのに要素が3つ → エラー
# 実行結果
ValueError: too many values to unpack (expected 2)
zipを使ったループは安全
for x, y in zip("abc", [1, 2]):
print(x, y)
# 実行結果
a 1
b 2
zipは余った要素を自動的に無視してくれるため、ループ処理にも便利です。
表で整理してみる
比較項目 | アンパック代入 | zip関数 |
---|---|---|
要素数の一致 | 必要(違うとエラー) | 不要(短い方に合わせる) |
エラーの可能性 | あり(ValueError) | 原則なし |
イテラブルの扱い | 各要素を個別に代入 | 複数イテラブルの同時処理 |
for文との相性 | 要素数が合わないとエラー | 柔軟に扱える(長さが違ってもOK) |
補足:zipの中身はイテレータ
zip関数は イテレータ を返します。
必要に応じて list()
などで展開して中身を見ます。
z = zip([1, 2], ['a', 'b'])
print(z) # <zip object at ...>
print(list(z)) # [(1, 'a'), (2, 'b')]
一度 list(z)
で中身を取り出すと、zipオブジェクトは使い切られる点にも注意が必要です。
まとめ
- アンパックは「要素数が一致しないとエラー」になる
- zipは「最も短いイテラブルに合わせて処理」されるためエラーにならない
- 初心者目線だと混乱しやすい違いだが、役割や設計思想がそもそも違う
以上、Python学習中のメモとして「アンパックとzipの違い」を整理してみました。
どなたかの学習の参考になればうれしいです。