くだすれPython(超初心者用) その10

このエントリーをはてなブックマークに追加
107デフォルトの名無しさん
a = 10
b = None
class Hoge(object):
  def __init__(self):
    self.x = []
    for c in xrange(a):
      self.x.append(c)
    if b is None:
      b = self.x
  def fuga(self):
    print self.x

>>> h = Hoge()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 6, in __init__
UnboundLocalError: local variable 'b' referenced before assignment

この場合
    if b is None:
の直前の行に追加で
    global b
を書くと期待通りに動くのですが
なぜ
    for c in xrange(a):
のところの a の方の参照ではエラーが出ないんでしょう?
108デフォルトの名無しさん:2011/01/23(日) 03:15:40
__init__関数をコンパイルする時、
b = self.x とあるから
bはローカル変数と見なされたから。
代入操作は必ずローカルになる。
109デフォルトの名無しさん:2011/01/23(日) 03:39:57
エラってるのは if b is None: のところだろ
110デフォルトの名無しさん:2011/01/23(日) 03:41:30
コンパイル時に代入されてるからローカル変数になって
実行時に参照しようとしてローカル変数が無いってことだろ