Pythonのスコープについて調べてみた

Pythonのスコープを良く知らないで危うい思いをするところでしたが、心あるocean-cityさんがやさしく教えてくれたので助かったEnogunoCapです。こんにちは。

そんなこんなでちゃんと調べておかないと後で痛い目を見そうなので、Pythonのスコープについてもうちょっと調べてみました。

わかったことは
・スコープはネストできる。

def method1():
  def method2():
    a = 1
    print a         # 1が表示される
  print a           # これはエラー

・名前が衝突すると外側のスコープより内側のスコープでの定義が優先される。

def method1():
  a = "method1"
  def method2():
    a = "method2"   # method2の中では内側のスコープでの変数として「a」が定義される
    print a         # method2が表示される
  print a           # method1が表示される。method1のスコープでの「a」は変更されていない

・スコープが区切られるのは、クラス定義の中、defでのメソッド定義のなか、lambdaの式の中である。forはスコープの区切りとならない。

class ClassA:
  c_scope = "class"
  def method1():
    m_scope = "method"
    lam = lambda l_scope : l_scope
    res = lam("lambda")
    print l_scope   # エラー スコープ外になる
    for f_scope in range(10):
    print f_scope   # 9が表示される。forはスコープを区切らない
  print m_scope     # エラー スコープ外になる
print c_scoep       # エラー スコープ外になる

うお、昼休みが終わってしまった。
ちゃんと試していないので、ダウトがあるかもしれません。