gpt4 book ai didi

python - 从另一个模块引用的变量的值在其自己的模块中更改后不会更改

转载 作者:行者123 更新时间:2023-11-28 22:58:01 24 4
gpt4 key购买 nike

我开始写 python 程序有一段时间了,但我不太擅长,目前我遇到一个问题,看起来很奇怪,至少对我来说是这样。

假设我们有两个源文件,分别是A.pyB.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

最佳答案

循环导入(A导入BB导入A)与模块之一结合成为主要脚本是个问题。

Python如何导入模块

当您要求 Python 导入模块时,它首先会查看 sys.modules 以查看是否已存在同名模块。如果是这样,它只使用该模块。如果没有该名称的模块,它会创建一个新的模块对象,将其放在 sys.modules 中,并在该模块中运行适当的 Python 代码。

主要脚本

Python 脚本中使用了一个流行的习语:无处不在

if __name__ == '__main__':

当 Python 想要运行主脚本时,它会导入名为 __main__ 的模块

当你的主脚本只是对其他模块做一些事情时,这完全没问题,但是当其他模块想要再次对主模块做一些事情时,你就会遇到麻烦:再次导入主模块的脚本可能是由一个正常的导入它名称(如本例中的 A)。不幸的是,已经加载的模块没有命名为 A;它被命名为 __main__

解决方案

一个非常简单的解决方案就是删除其他模块对主模块的依赖。那么你就不会遇到这种不直观的行为。您可以这样做的一种方法是让主脚本只是一个调用另一个模块的 main 函数或其他东西的 stub 。

另一种解决方案是让主脚本手动更改 sys.modules 以将其自身置于另一个名称下。这有点 hacky,但它有效:

sys.modules['A'] = sys.modules[__name__]

现在你知道了。

关于python - 从另一个模块引用的变量的值在其自己的模块中更改后不会更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14207426/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com