我开始写python程序有一段时间了,但我不是很擅长,目前我遇到一个问题,这似乎很奇怪,至少对我来说是这样。
假设我们有两个名为A.py
and的源文件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
被导入了两次,一个是命名的__main__
,另一个是命名A
的,模块中的值发生了变化__main__
,但是对于模块B
,值是从模块中获取A
的,所以值没有改变。
我确实需要更深入地了解python的模块导入。:-D