作者sbrhsieh (sbr)
看板Python
标题Re: [问题] 拿别的档案的global变数会有问题
时间Thu Jul 23 20:00:38 2009
※ 引述《iqiq (哈哈哈)》之铭言:
: 我的code如下
: 我想要在self.a.Test()执行完後,print出123数值
: 但都办不到(只会印出0)
: 要怎样在A.py里面拿到main.py中kkkkk已经改变过的数值呢?
: --------------------------------------------------------
: main.py:
: import A
: kkkkk = 0
: def SetAAPP(num):
: global kkkkk
: kkkkk = num
: def GetAAPP():
: global kkkkk
: return kkkkk
: class B:
: def __init__(self):
: pass
: def Initial(self):
: self.a = A.A()
: self.a.Test()
: if __name__ == "__main__":
: b = B();
: SetAAPP(123)
: b.Initial();
: A.py:
: import main
: class A:
: def __init__(self):
: pass
: def Test(self):
: aaaaa = main.kkkkk
: print aaaaa
上述程式码的作法,当一个 A instance 执行 Test method 时的确是可以存取
module 'main' 的 kkkkk member。
那你的问题在於,你透过 Python interpreter 直接去执行 main.py 时,main.py
被载入成为 module '__main__' 而不是 module 'main'。也就是说当你这样子
执行 main.py 时:
python main.py
main.py 会被载入并执行成为 module '__main__',在载入这个 module 时会
导致 A.py 被载入成为 module 'A',而 module 'A' 载入过程又会去载入一次
main.py 档成为 module 'main'。module '__main__' 载入时执行了:
b = B()
SetAAPP(123)
b.Initial()
SetAAPP(123) statement 执行过後 module '__main__' 的 member: kkkkk 的
值会变更为 123,但是 module 'A' 载入过程去载入的 module 'main' 的
member: kkkkk 在 module 'main' 载入後就没有变更过(值为 0)。
如果你不能了解我上述在讲什麽,你可以试着把 main.py 改成如下:
import A
kkkkk = 0
def SetAAPP(num):
global kkkkk
kkkkk = num
def GetAAPP():
global kkkkk
return kkkkk
class B:
def __init__(self):
pass
def Initial(self):
self.a = A.A()
self.a.Test()
def info():
import sys
# main.py is loaded twice as module __main__ and module main.
print sys.modules['__main__'].kkkkk, sys.modules['main'].kkkkk
def main():
b = B()
SetAAPP(123)
b.Initial()
if __name__ == "__main__":
main()
info()
以 python main.py 来执行时,会获得这样子的输出:
0
123 0
如果你执行 python.exe,然後执行以下的 statements:
import main
main.main()
输出就是:
123
一如你原先设计所要的效果。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 218.173.139.59
※ 编辑: sbrhsieh 来自: 218.173.139.59 (07/23 20:03)
※ 编辑: sbrhsieh 来自: 218.173.139.59 (07/23 23:15)
1F:推 iqiq:it work! 太感谢了~~~ ^_^ 07/24 00:32
2F:推 Bemu13Floor:原来如此 o.O 07/24 02:57