为什么不能在python中更改另一个modules变量?

2024-04-19 04:37:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图允许第二个模块在循环导入中修改第一个模块的变量,但似乎不起作用。在

我有两个问题:1)为什么这不起作用/从语言发展的角度来看,这是为什么?2)有没有任何简单的解决方案可以让我以稍微不同的方式做同样的事情?在

a.py:

import b

test1 = 'a'
test2 = None
test3 = '3'

if __name__ == '__main__':
  print test1, test2, test3 #prints 'a', None, 3
  b.changeVars()
  print test1, test2, test3 #prints 'a', None, 3 (i.e. nothing has changed)

备份:

^{pr2}$

Tags: 模块pyimportnone语言if方式解决方案
2条回答

b.py试图import a时,sys.modules中没有它的条目,因为该条目位于__main__之下。这将导致导入机制重新导入模块并将其置于名称a下。所以现在有一个a模和一个完全无关的__main__模。将b.py更改为类似这样的值就可以了。在

import sys
a = sys.modules['__main__']

def changeVars():
  print a.test1, a.test2, a.test3 #prints 'a', None, 3
  a.test1 = 'NEW VAR 1'
  a.test2 = 'NEW VAR 2'
  a.test3 = 'NEW VAR 3'

  print a.test1, a.test2, a.test3 #prints 'NEW VAR 1', 'NEW VAR 2', 'NEW VAR 3'

收益率

^{pr2}$

为了得到一个更好的例子,请考虑以下文件:

^{3}$

以及

#b.py
import a as a1

import sys
a2 = sys.modules['__main__']

def changeVars():

  print a1.test, a2.test # Prints 'Foo', 'Foo'
  a2.test = 'Bar'
  print a1.test, a2.test # Prints 'Foo', 'Bar'

哪些输出

Foo
Foo Foo
Foo Bar
Foo Bar

这清楚地表明sys.modules['a']和{}是指两个不同的对象。解决方案可能是将以下内容作为a.py的第一行

import __main__ as a  # due to Ignacio Vazquez-Abrams 

这样做也允许任何其他模块import a。总的来说,我真的不明白你为什么要这么做。也许有更好的方法来完成这件事。在

完成这种任务的一个更好的方法是在要更改变量的同一个模块中声明变量。在本例中,b。然后在a内导入b,你可以做任何你想做的事情想要。你可以使用未更改的变量,就像在a中声明它们一样,也可以更改它们。看看这个:

b.py公司

test1 = 'a'
test2 = None
test3 = '3'

def changeVars():
    global test1,test2,test3
    test1 = 'NEW VAR 1'
    test2 = 'NEW VAR 2'
    test3 = 'NEW VAR 3'

    print test1, test2, test3   #prints 'NEW VAR 1', 'NEW VAR 2', 'NEW VAR 3'

a.py

^{pr2}$


注意:在这种情况下不需要循环导入;循环导入会导致您的问题,因为它的行为不像您认为的那样。因此,只需一次导入,您就拥有了代码所需的所有内容,并且可以在两个模块中修改这些变量值。在

相关问题 更多 >