2016/11/19

[py]スコープはモジュールと関数しかないそうだ

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 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。

注: コメントを投稿できるのは、このブログのメンバーだけです。