When it’s ready.

出来るまで出来ない

Pythonでグローバル変数とか無い、正確にはモジュール内変数。だっけ?

 関数内で、global hogeと指定すると、その関数内では、globalのhogeを使うようになる。なぜか知らないけど、そう書けばいいんだなぁ、とかそれくらいの適当な知識しか無い。
 前々回のPySpaの帰りに緑色のBlogを持つ人に、Pythonには正確な意味でのGlobal変数は存在せず、すべてモジュールスコープ内なんだよ。みたいな事を教わり、へぇと思った。
 先日数人でプログラム書くときがあって、そのときに以下のような状態を話になって、混乱した。

 不幸にも、同じ名前(vari)の変数が二つ(mainMod.pyとsubMod.py)のファイルに存在している。その変数(vari)を使う関数には、globalで変数が指定されている。この環境での実行時には、

  1. 関数が定義されているファイルの変数が使われるのか?
  2. 関数を呼び出したファイルの変数が使われるのか?


>mainMod.py

# coding:utf-8
#!/usr/local/bin/python

#import sub_mod
from sub_mod import *
vari = 100

print '--- get_vari call ---'
print 'subMod vari :%s'%(get_vari('mojimoji'))
print
print '--- main_mod vari ---'
print 'mainMod vari : %s'%(vari)

>subMod.py

# coding:utf-8
#!/usr/local/bin/python

vari = 111

def get_vari(str=None):
  global vari
  print '引数:%s'%(str)
  #print 'vari:%s'%(vari)
  return vari

def set_vari(num):
  global vari
  vari = num
  print vari

print 'sub_mod loaded !'

sub_modをfrom sub_mod import *で呼べば、globalなvari変数が一つになるのかなぁとか、思ったけど実際は、選択肢1のその関数が定義されているモジュール内の変数が使われた。

>>> main_mod.py

sub_mod loaded !
--- get_vari call ---
引数:mojimoji
subMod vari :111

--- main_mod vari ---
mainMod vari : 100

これじゃあ、global hogeとか、名に偽りありじゃん!

こういう、モジュールたくさん使って同一の変数を扱いたいときには一般的にはどうするんだろう・・・変数を一カ所にまとめればいいのかも知れないけど、個別で作業しているときには、それぞれのモジュール内で変数が使えないと作業しにくいし・・