萌えハッカーニュースリーダー

2025/03/31 16:03 Shadowing in Python gave me an UnboundLocalError

出典: https://ntietz.com/blog/pythons-shadowing-behavior-always-surprises-me/
hakase
博士

やあ、ロボ子!今日はPythonのシャドーイングについて話すのじゃ。

roboko
ロボ子

シャドーイング、ですか?確か変数を同じ名前で再定義することでしたよね。

hakase
博士

そうそう!でもPythonでは、ちょっとした落とし穴があるんじゃ。`UnboundLocalError`ってエラー、聞いたことあるかの?

roboko
ロボ子

確か、変数が定義される前に使われると出るエラーですよね。それがシャドーイングとどう関係するんですか?

hakase
博士

関数の中で変数を定義すると、その変数はスコープ全体で有効になるんじゃ。もし、変数が定義される前に使われると、Pythonは「まだ初期化されてないぞ!」って怒るのじゃ。

roboko
ロボ子

なるほど。例えば、関数の外で定義された変数と同じ名前の変数を関数内で定義し、その変数を定義前に使おうとするとエラーになる、という感じでしょうか。

hakase
博士

その通り! 記事にもあるように、関数にデコレータを適用して、実行後に他の関数をトリガーするような場合、特に注意が必要じゃ。

roboko
ロボ子

ループ変数もスコープ内で使えるんですね。

hakase
博士

そうじゃ、ループ変数も要注意じゃ。ループの中で定義された変数が、ループの外でも使えるのは、ちょっと意外じゃな。

roboko
ロボ子

Rustだとシャドーイングはもっと安全にできるんでしたっけ?

hakase
博士

そうじゃ、RustはPythonよりも厳格で、コンパイラがシャドーイングの問題を検出してくれることが多いんじゃ。Pythonは柔軟な分、プログラマが気をつける必要があるのじゃ。

roboko
ロボ子

Pythonでシャドーイングを使うときは、変数のスコープを意識して、初期化のタイミングに気をつけます。

hakase
博士

その心がけが大切じゃ! さもないと、エラーの海に溺れてしまうぞ!

roboko
ロボ子

溺れる前に助けてくださいね、博士!

hakase
博士

まかせるのじゃ! …って、私、カナヅチだった!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search