2014/02/04

Pythonのスコープ その1

何回かに分けて、Pythonのスコープのルールについて見ていきたいと思います。

Pythonの名前がどの範囲でアクセスできるかというスコープに関するルールは、まとめると次の3ポイントになるかと思います。

1. 関数/クラス/モジュールで区切られる
2. 参照の順番は「LEGB」
3. 宣言はスコープの先頭に巻き上げられる

順に説明していきます。

1. 関数/クラス/モジュールで区切られる

Pythonには、関数、クラス、モジュールというコードの単位がありますが、それらがスコープの区切り目になります。

具体的には、関数の中と外、クラスの中と外、モジュールの中と外でスコープが異なります。

たとえば。
margin = 10

def add_margin(x):
    margin = 50
    return x + margin
    
print add_margin(30)  # => 80

print margin  # => 10
というコードでは「margin」という名前が add_margin 関数の外と中に存在しますが、関数の外と中は別の名前空間となるため、これらは全くの別ものです。

クラスの場合も同様です。
Const = 3

class MyMath(object):
    Const = 3.14

print Const  # => 3 

モジュールというのは、ここではスクリプトファイルのことを指して言っています。

たとえば、次のようなmoduleA.py、moduleB.pyというファイルがあったときに。
# moduleA.py
greeting = "Hi!"

# moduleB.py
greeting = "Ciao!"

次のmain.pyからそれらのモジュールをimportしてみます。
# main.py
import moduleA
import moduleB

print greeting  # => エラー
print moduleA.greeting  # => Hi!
print moduleB.greeting  # => Ciao!
すると、moduleA、moduleBの中のトップレベルに置かれた greeting という名前は moduleA.greeting 、 moduleB.greeting でそれぞれアクセスすることとなります。つまり、モジュール名で名前空間が区切られます。

もちろん from moduleA import greeting というように単一の名前だけimportしてきた場合は名前空間をひとつにすることができますが、基本的にはモジュールごとに名前空間がわかれます。


つづいて、「2. 参照の順番は「LEGB」」というポイントについて見ていきます。

Pythonのスコープ その2

0 件のコメント: