写入模块范围的变量

Vin*_*arg 2 python

可以说我有这3个(小)python文件 -

a.py

myvar = 'a'
Run Code Online (Sandbox Code Playgroud)

b.py

import a
import c

myvar = 'b'
c.pr()
Run Code Online (Sandbox Code Playgroud)

c.py

from a import myvar

def pr():
    print myvar
Run Code Online (Sandbox Code Playgroud)

现在,如果我执行,b.py我得到输出

a
Run Code Online (Sandbox Code Playgroud)

但我真的希望输出为

b
Run Code Online (Sandbox Code Playgroud)

所以请告诉我如何重组/修改程序,以便为模块范围 myvar分配不同的值.

Yan*_*ann 6

b.py中,您正在设置b.py的myvar.您想要访问myvar的值.所以b.py可能看起来像:

import a
import c

a.myvar = 'b' # belongs to a
myvar = 'something different' # belongs to b
c.pr()
Run Code Online (Sandbox Code Playgroud)

你需要更新c.py,以便它使用a.py的myvar,而不是它自己的本地副本.所以c.py:

import a

def pr():
    print a.myvar
Run Code Online (Sandbox Code Playgroud)

为什么?

在你原来的c.py中,当你打电话时from a import myvar,这相当于:

import a
myvar = a.myvar
Run Code Online (Sandbox Code Playgroud)

这会在导入myvar生成c.py的本地版本.如果这令人困惑,我发现这篇文章关于python变量如何工作非常有用.


SiH*_*iHa 6

我是通过第四个模块来做到的d.py.

该模块由'a','b'和'c'导入.

如在文档中:

在单个程序中跨模块共享信息的规范方法是创建一个特殊模块(通常称为config或cfg).只需在应用程序的所有模块中导入配置模块; 然后该模块可用作全局名称.因为每个模块只有一个实例,所以对模块对象所做的任何更改都会反映在任何地方

小心点 一旦你创建了这个配置模块,因为它是必要的,它很容易被带走并开始添加其他变量,因为它就在那里.大部分时间都有更好的方法......