やっほー!国内の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("盾"))
▼ クリックで正解を表示
def add_item(item, box=[]):
box.append(item)
return box
print(add_item("剣"))
print(add_item("盾"))['剣', '盾']
解説:
デフォルト引数の [] は、関数が定義された時に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=" ")
▼ クリックで正解を表示
# 0, 2, 4, 6, 8 を返す関数を作ったつもり...
funcs = [lambda: i * 2 for i in range(5)]
# 全部実行してみる
for f in funcs:
print(f(), end=" ")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}")
▼ クリックで正解を表示
a = [1, 2, 3]
b = [1, 2, 3]
print(f"a is b: {a is b}")解説:
==:「値」が同じかチェック(中身が一緒ならOK)。is:「モノ(ID)」が同じかチェック(メモリ上の同じ場所にいるか)。
a と b は「中身は同じ」だけど「別々に作られた箱」だから、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)
▼ クリックで正解を表示
nums はどうなる?nums = [1, 2, 2, 3]
for n in nums:
if n % 2 == 0:
nums.remove(n) # 偶数を削除
print(nums)[1, 2, 3]
解説:
「えっ、全部の偶数が消えるんじゃないの?」って思うよね。
ループが1つ目の 2 を見つけて削除すると、リストが詰められて、2つ目の 2 が「1つ目の2がいた場所」に移動してくるんだ。
でもループのカーソル(インデックス)は次の場所に進んじゃうから、移動してきた「2つ目の2」はチェックされずにスルーされちゃうんだよ😱
対策: nums[:](コピー)で回すか、新しいリストを作っちゃおう!
罠Lv.5:孤独なタプル(カンマの重要性)
最後はこれ!地味だけど破壊力抜群!
次の変数のうち、型が tuple になるのはどれ?
t1 = (10)
t2 = (10,)
▼ クリックで正解を表示
tuple になるのはどれ?t1 = (10)
t2 = (10,)t2
解説:
カッコ () は計算の優先順位を変えるためにも使われるから、Pythonは (10) を「カッコに入った数字の10」と判断しちゃう。
要素が1個だけの時は、カンマ , をつけないとタプルにならないんだ!
type((10)) は int、type((10,)) は tuple だよ。
💀 最終試験:ひっかけクイズ
ここまで読んだ君なら、この問題も解けるはず…!?
次の計算結果はどうなる?
0.1 + 0.2 == 0.3
▼ クリックで正解を表示
解説:
これはPythonに限らずコンピュータの宿命!
内部では2進数で計算してるから、0.1 + 0.2 は 0.30000000000000004 になっちゃうんだ。
お金の計算とか厳密さが必要な時は decimal モジュールを使おう!
以下のコードで x の値はどうなる?
x = 10
def f():
print(x)
x = 20
f()
▼ クリックで正解を表示
x の値はどうなる?解説:
関数内で x = 20 と書いた瞬間、その関数内の x は「ローカル変数」とみなされる。
なのにその前で print(x) しようとしてるから、「まだ宣言されてないローカル変数を使おうとした!」って怒られるんだ。
グローバル変数を使いたいなら global x が必要だよ!
まとめ:罠を知る者はバグを制す!
お疲れ様!番外編、楽しんでもらえたかな?
「なんだよPython、面倒くさいな!」って思ったかもしれないけど、このクセを知っているかどうかが、初心者と上級者の分かれ道なんだ。
これらの罠を回避して、安全で美しいコードを書けるようになった君はもう無敵!
これからも楽しいPythonライフを送ってね!応援してるよ〜!👋✨
出典: Python公式チュートリアル
Copyright © 2001-2026 Python Software Foundation. Licensed under the PSF License.






