如果使用'from ... import'导入,为什么不能更改模块中全局变量的值?

时间:2017-02-12 19:21:32

标签: python global-variables python-import

我正在努力理解模块中全局变量的以下行为。我想从另一个模块导入一个变量,并通过函数调用更改它的值(这是因为在我的用例中该函数必须访问模块的其他'私有'部分)。我知道如何避免使用全局变量,我做到了,但我仍然很好奇。

第一种方法

这是the preferred method之后的python文档。所有全局变量都放在外部config.py中,必须在任何地方导入。

#config.py
s = 'initialized'

#module.py
import config

def chg():
    config.s = 'changed'
    prt()

def prt():
    print(config.s)

#main.py
import config
import module

print(config.s)
module.chg()
print(config.s)

这很好用(我在这里也读了一些关于这个方法的线程):我们不仅可以从其他文件访问s,而且可以从任何地方更改它的值,而且这种变化是“持久的”。

guest@desktop /tmp $ python3 main.py 
initialized
changed
changed

第二种方法

我不清楚是否需要它或者强烈建议将所有全局内容分成另一个文件。

#module.py
s = 'initialized'

def chg():
    global s
    s = 'changed'
    prt()

def prt():
    print(s)

#main.py
import module

print(module.s)
module.chg()
print(module.s)

显然,这不是强制性的。所以这不是魔术; - )

guest@desktop /tmp $ python3 main.py 
initialized
changed
changed

第三种方法

这是我迷失的地方。我采用与第二个相同的基础,但是我改变了导入全局变量的方式。

#main.py
from module import s, chg

print(s)
chg()
print(s)

这不再起作用了(我的意思是,正如我所料......)。

guest@desktop /tmp $ python3 main.py 
initialized
changed
initialized

那么,我在这里错过了什么?我读到的大多数线程都在处理导入全局变量但不更改其值。显示了两种方法。谢谢!

0 个答案:

没有答案