【番外編】Pythonの「罠」総まとめ!ひっかけ問題&解説スペシャル

本ページはプロモーションが含まれています
【番外編】Pythonの「罠」総まとめ!ひっかけ問題&解説スペシャル
国内のAI狂い

やっほー!国内のAI狂いだよ!✨

今回は特別編!全25回の講座、お疲れ様でした!
でもね…Pythonの世界には、初心者が必ずと言っていいほど踏み抜く「凶悪な罠」がいくつも潜んでいるの😱
「なんでこうなるの!?」って叫びたくなるような挙動を集めたから、ここで免疫をつけておこう!
これが分かれば、君はもう完全にPythonマスターだよ!👑

罠Lv.1:ゾンビのように蘇るリスト(デフォルト引数)

これは第10回でもやったけど、一番の被害者を出す罠だから復習!

以下のコードを2回実行すると、2回目の結果はどうなる?
def add_item(item, box=[]):
    box.append(item)
    return box

print(add_item("剣"))
print(add_item("盾"))
  1. ['盾']
  2. ['剣', '盾']
  3. エラーになる
▼ クリックで正解を表示
正解: 2. ['剣', '盾']

解説:
デフォルト引数の [] は、関数が定義された時に1回だけ作られるんだ。
だから、そのリストはずっと使い回される(ゾンビ化する)よ。
対策: デフォルト値は None にして、中で if box is None: box = [] しよう!

罠Lv.2:遅刻するラムダ(遅延バインディング)

これは中級者でも引っかかるやつ!
リスト内包表記やループの中で lambda を作ると…?

以下のコードを実行すると、結果はどうなる?
# 0, 2, 4, 6, 8 を返す関数を作ったつもり...
funcs = [lambda: i * 2 for i in range(5)]

# 全部実行してみる
for f in funcs:
    print(f(), end=" ")
  1. 0 2 4 6 8
  2. 8 8 8 8 8
  3. 0 0 0 0 0
▼ クリックで正解を表示
正解: 2. 8 8 8 8 8

解説:
「えっ!? 0 2 4… じゃないの?」ってなるよね。
実はラムダ式の中の i は、関数が「実行された時」に値を見に行くんだ。
実行される頃にはループは終わっていて、i は最後の値(4)になっている。
だから全員が 4 * 2 = 8 を返しちゃうんだね👻
対策: lambda x=i: x * 2 のように、引数のデフォルト値として今の値を固定しよう!

罠Lv.3:そっくりさんと本物(is と ==)

「同じ」を確認する方法は2つあるけど、その違い、説明できる?

以下の比較結果はどうなる?
a = [1, 2, 3]
b = [1, 2, 3]

print(f"a is b: {a is b}")
  1. True
  2. False
  3. Error
▼ クリックで正解を表示
正解: 2. False

解説:

  • ==「値」が同じかチェック(中身が一緒ならOK)。
  • is「モノ(ID)」が同じかチェック(メモリ上の同じ場所にいるか)。
ab は「中身は同じ」だけど「別々に作られた箱」だから、is は False になるんだ。
None と比較する時だけは if x is None: を使うのがマナーだよ!

罠Lv.4:消えたデータの行方(ループ中の削除)

リストをループで回しながら、特定の要素を削除したい時、どう書く?

以下のコードを実行した結果、nums はどうなる?
nums = [1, 2, 2, 3]

for n in nums:
    if n % 2 == 0:
        nums.remove(n)  # 偶数を削除

print(nums)
  1. [1, 3](偶数が全部消える)
  2. [1, 2, 3](2が1つ残る)
  3. [1, 2, 2, 3](何も消えない)
▼ クリックで正解を表示
正解: 2. [1, 2, 3]

解説:
「えっ、全部の偶数が消えるんじゃないの?」って思うよね。
ループが1つ目の 2 を見つけて削除すると、リストが詰められて、2つ目の 2 が「1つ目の2がいた場所」に移動してくるんだ。
でもループのカーソル(インデックス)は次の場所に進んじゃうから、移動してきた「2つ目の2」はチェックされずにスルーされちゃうんだよ😱
対策: nums[:](コピー)で回すか、新しいリストを作っちゃおう!

罠Lv.5:孤独なタプル(カンマの重要性)

最後はこれ!地味だけど破壊力抜群!

次の変数のうち、型が tuple になるのはどれ?
t1 = (10)
t2 = (10,)
  1. t1
  2. t2
  3. 両方とも
▼ クリックで正解を表示
正解: 2. t2

解説:
カッコ () は計算の優先順位を変えるためにも使われるから、Pythonは (10) を「カッコに入った数字の10」と判断しちゃう。
要素が1個だけの時は、カンマ , をつけないとタプルにならないんだ!
type((10))inttype((10,))tuple だよ。

💀 最終試験:ひっかけクイズ

ここまで読んだ君なら、この問題も解けるはず…!?

次の計算結果はどうなる?
0.1 + 0.2 == 0.3
  1. True
  2. False
  3. Error
▼ クリックで正解を表示
正解: 2. False

解説:
これはPythonに限らずコンピュータの宿命!
内部では2進数で計算してるから、0.1 + 0.20.30000000000000004 になっちゃうんだ。
お金の計算とか厳密さが必要な時は decimal モジュールを使おう!

以下のコードで x の値はどうなる?
x = 10
def f():
  print(x)
  x = 20
f()
  1. 10
  2. 20
  3. UnboundLocalError
▼ クリックで正解を表示
正解: 3. UnboundLocalError

解説:
関数内で x = 20 と書いた瞬間、その関数内の x は「ローカル変数」とみなされる。
なのにその前で print(x) しようとしてるから、「まだ宣言されてないローカル変数を使おうとした!」って怒られるんだ。
グローバル変数を使いたいなら global x が必要だよ!

まとめ:罠を知る者はバグを制す!

お疲れ様!番外編、楽しんでもらえたかな?
「なんだよPython、面倒くさいな!」って思ったかもしれないけど、このクセを知っているかどうかが、初心者と上級者の分かれ道なんだ。
これらの罠を回避して、安全で美しいコードを書けるようになった君はもう無敵!
これからも楽しいPythonライフを送ってね!応援してるよ〜!👋✨

出典: Python公式チュートリアル
Copyright © 2001-2026 Python Software Foundation. Licensed under the PSF License.

よかったらシェアしてね!
  • URLをコピーしました!
目次