pythonのスコープが全然理解できていない。
初出場の変数でエラーになるかと思えば、別の場所で使っている同じ変数名で「また使ってますよ」みたいな警告が出たりする。
なんなのだ、いったい!
Community Blog - Python の名前空間とスコープ
python 2.7.2の記事だが、スコープはモジュールと関数しかない、と書かれている。
それって、ブロック内の変数という見方ができない、ということか。。。
if文の中で使った変数が、他のところで同じ名前を使うと警告される理由が分かった。
変数をもっと局所的にしたいときは、関数の中に関数を書くことができるから、それで分離するとよいらしい。
val1 = 10
def func1():
val2 = 20
print 'val1=', val1
print 'val2=', val2
def func1in(v):
if v == val1 * 2:
return val1 * 4
else:
return -1
val2 = func1in(val2)
print 'val2=', val2
func1()
結果
val1= 10
val2= 20
val2= 40
func1in()の引数をなくして、これでもいける。
val1 = 10
def func1():
val2 = 20
print 'val1=', val1
print 'val2=', val2
def func1in():
if val2 == val1 * 2:
return val1 * 4
else:
return -1
val2 = func1in()
print 'val2=', val2
func1()
ただ、func1in()の中でval2への代入を行うと、ifで使っているval2がエラーになる。
val1 = 10
def func1():
val2 = 20
print 'val1=', val1
print 'val2=', val2
def func1in():
if val2 == val1 * 2:
val2 = val1 * 4
else:
val2 = -1
func1in()
print 'val2=', val2
func1()
じゃあ、func1in()の中に「global val2」を書けばよいかというと、これは実行時エラーになってしまう。
もしかして「globalじゃなくてlocalでは?」とやってみたが、そんなキーワードはなかった。。。
できなさそうな感じがするけれども、根拠の情報は出てこなかった。
まあ、初出場のグローバルじゃない変数は代入した時点でローカル変数になるらしいから、これも同じことか。
0 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。