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 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。