いよいよPythonに親しむに従い、さらに知らなかったことを知る。楽しからずや。
今回はグローバル変数。正直、「変数は極力ローカル」という教えに従いそう生きてきた俺だったが、遂にやむにやまれずグローバル変数に手を出すことにした。というかむしろトリッキーなコードになるぐらいなら素直に積極的にグローバル変数に手を出した方がマシと思うのだが、まあいいか。(そういうときは設計の間違いのようにも思える)
が、それはともかく、Cのように適当にやればグローバルになるわけではなかった。
クラスのコンストラクタ内で使おうとしたら、そんなローカル変数は定義されていないとか言いやがる…
スコープ内でglobalと宣言していなければ、グローバル変数としては扱われない…?
確かに、そうしてみたら、問題のコードではグローバル変数として認識され、動いた。
が、Pythonコンソール(PythonWin)や、極小にしてみたコードをpythonから実行してみるのでは、普通に外部の何もないところで宣言したグローバル変数がグローバル変数として使えているようで、何がなんだかよくわからない…
と、弄ってるうちに理由が判明したので、ここに書いておこう。
global_val = 0
class hoge:
def __init__(self):
self.myval = global_val
これは普通に使用できるし、グローバル変数の中身を参照も出来ている。
global_val = 0
class hoge:
def __init__(self):
self.myval = global_val
global_val+=1
こっちはエラー。
global_val = 0
class hoge:
def __init__(self):
global global_val
self.myval = global_val
global_val+=1
これなら動く。
要するに。グローバル変数を書き換えるには、global宣言が必要!ってことだと思う。tclに似てるな。
今回はグローバル変数。正直、「変数は極力ローカル」という教えに従いそう生きてきた俺だったが、遂にやむにやまれずグローバル変数に手を出すことにした。というかむしろトリッキーなコードになるぐらいなら素直に積極的にグローバル変数に手を出した方がマシと思うのだが、まあいいか。(そういうときは設計の間違いのようにも思える)
が、それはともかく、Cのように適当にやればグローバルになるわけではなかった。
クラスのコンストラクタ内で使おうとしたら、そんなローカル変数は定義されていないとか言いやがる…
スコープ内でglobalと宣言していなければ、グローバル変数としては扱われない…?
確かに、そうしてみたら、問題のコードではグローバル変数として認識され、動いた。
が、Pythonコンソール(PythonWin)や、極小にしてみたコードをpythonから実行してみるのでは、普通に外部の何もないところで宣言したグローバル変数がグローバル変数として使えているようで、何がなんだかよくわからない…
と、弄ってるうちに理由が判明したので、ここに書いておこう。
global_val = 0
class hoge:
def __init__(self):
self.myval = global_val
これは普通に使用できるし、グローバル変数の中身を参照も出来ている。
global_val = 0
class hoge:
def __init__(self):
self.myval = global_val
global_val+=1
こっちはエラー。
global_val = 0
class hoge:
def __init__(self):
global global_val
self.myval = global_val
global_val+=1
これなら動く。
要するに。グローバル変数を書き換えるには、global宣言が必要!ってことだと思う。tclに似てるな。