しばらくの間Pythonプログラムを書き始めましたが、あまり得意ではありません。現在、問題が発生しています。少なくとも私にとっては、非常に奇妙に思えます。
A.py
とという2つのソースファイルがあると仮定しますB.py
。それらの内容は次のとおりです。
A.py
import B
__global__ = 'not set yet'
class Data:
__var__ = 'not set yet'
def init():
global __global__
__global__ = 'value set for global'
Data.__var__ = 'value set for class var'
if __name__ == '__main__':
init()
t = B.Test()
t.display()
print '============================'
print 'global(in A): ' + __global__
print 'class var(in A): ' + Data.__var__
B.py
import A
class Test:
def __init__(self):
self.glo = A.__global__
self.var = A.Data.__var__
def display(self):
print 'global: ' + self.glo
print 'class var: ' + self.var
print '============================'
print 'global(in B): ' + A.__global__
print 'class var(in B): ' + A.Data.__var__
次に実行python A.py
しました。出力は次のとおりです。
global: not set yet
class var: not set yet
============================
global(in B): not set yet
class var(in B): not set yet
============================
global(in A): value set for global
class var(in A): value set for class var
私の意見では、最初の4つの出力は最後の2つの出力と一致するはずですが、実際はそうではなく、値はクラスとメソッドの定義中に設定され、変更できないようです。これは、Javaなどの他の多くの言語とは大きく異なります。それで、誰かがこれを説明するのを手伝うことができますか、それを理解するのを助けるために私にいくつかのリンクを貼り付けてください?そして、これを解決するための回避策はありますか?
前もって感謝します、
ケルビン
==============編集==============
@ icktoofay、@ hop、@ RocketDonkeyに感謝します。以下のコードを試した後、根本的な原因を見つけました。
import sys
import A
import __main__
__global__ = 'not set yet'
class Data:
__var__ = 'not set yet'
def init():
global __global__
__global__ = 'value set for global'
Data.__var__ = 'value set for class var'
if __name__ == '__main__':
init()
for key in sys.modules.keys():
if key in ['__main__', 'A']:
print key + ' : ' + sys.modules[key].__file__
print '===================='
print 'A: ' + A.__global__
print 'A: ' + A.Data.__var__
print '===================='
print __main__.__global__
print __main__.Data.__var__
出力は次のとおりです。
__main__ : A.py
A : D:\test\python\A.py
====================
A: not set yet
A: not set yet
====================
value set for global
value set for class var
これは、ファイルA.py
が2回インポートされたためです。1つは名前が付けられ__main__
、もう1つは名前が付けられA
、値はモジュールで変更されました__main__
が、モジュールB
の場合、値はモジュールから取得されるA
ため、値は変更されません。
Pythonのモジュールインポートについては、さらに深く掘り下げる必要があります。:-D