スコープについて整理
スコープの概念を抑えておかないとプログラムがめちゃくちゃになったり、バグが生じたりします。スコープを意識してコードを書くのは大切です。
今回はpythonのスコープに関してまとめてみました。
定義
スコープは、ソースコード上でオブジェクトが有効になる範囲です。
似たような言葉で名前空間という言葉があります。名前空間は、オブジェクトがどこに所属するの? という場所を扱います。
スコープは名前空間を含めもう少し広い領域をカバーします。ざっくり言えば、スコープ > 名前空間ということです。
3種類のスコープ
pythonのスコープは3種類あります。
ビルトインスコープ
組み込み関数や組み込み変数などです。これです。普段は意識しません。空気のような存在です。
モジュール(グローバル)スコープ
モジュールのトップレベルのブロックで定義されているスコープです。変数や関数のような名前が定義されています。最上位のスコープです。
スクリプトファイルとモジュールはpythonではほぼ同じものです。
ローカルスコープ
関数の定義に連動して作られるスコープです。
関数内の変数はローカルスコープに属します。
入れ子の関数によって生まれたスコープは、ネストされたスコープ(Nested Scope)と呼ばれます。
クラスとインスタンスのスコープ
クラスとインスタンスも独自のスコープをもちます。
「クラスのスコープ=モジュールスコープ」「インスタンスのスコープ=ローカルスコープ」と考えると理解しやすいです。
インスタンスからクラスのアトリビュートが参照できます。
まとめ
以上をまとめると下の図のイメージ。
