python中不能作为变量_为什么我不能在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)

b.py:

import a

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'

解决方法:

发生的事情是,当b.py尝试导入a时,sys.modules中没有它的条目,因为该条目位于__main__下.这会导致导入机制重新导入模块并将其置于名称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'

产量

aaron@aaron-laptop:~/code/tmp$python a.py

a None 3

a None 3

NEW VAR 1 NEW VAR 2 NEW VAR 3

NEW VAR 1 NEW VAR 2 NEW VAR 3

aaron@aaron-laptop:~/code/tmp$

要更好地了解正在发生的事情,请考虑以下文件:

#a.py

import b

import a

test = 'Foo'

if __name__ == '__main__':

print test #prints 'Foo'

b.changeVars()

print a.test, test # prints 'Foo', 'Bar'

#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’]和sys.modules [‘__ main__’]指的是两个不同的对象.解决方案可能是将以下内容作为a.py的第一行

import __main__ as a # due to Ignacio Vazquez-Abrams

这样做允许任何其他模块也可以导入.总的来说,我真的不明白你为什么要这样做.完成这项工作可能有更好的方法.

标签:python,import,variables,circular-dependency

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值