来自其他文件的全局变量 Python
我有两个不同的文件,类似这样:
file1.py
from file2 import *
foo = "bar"
test = SomeClass()
file2.py
class SomeClass :
def __init__ (self):
global foo
print foo
但是我发现file2无法识别file1中的变量,尽管file1已经把file2导入了。如果能以某种方式做到这一点,那就太好了。
8 个回答
from file2 import *
这个写法会导致复制。你想要这样做:
import file2
print file2.foo
print file2.SomeClass()
当你写
from file2 import *
时,它实际上是把在 file2
中定义的名字 复制 到 file1
的命名空间里。所以如果你在 file1
中重新给这些名字赋值,比如写
foo = "bar"
那么这个改变只会在 file1
中生效,而不会影响到 file2
。需要注意的是,如果你改变了 foo
的一个 属性,比如这样做
foo.blah = "bar"
那么这个改变会在 file2
中反映出来,因为你是在修改 foo
这个名字所指向的现有对象,而不是用一个新对象去替换它。
你可以通过在 file1.py
中这样做来达到你想要的效果:
import file2
file2.foo = "bar"
test = SomeClass()
(注意你应该删除 from foo import *
)不过我建议你仔细考虑一下,真的有必要这样做吗?在一个模块中改变另一个模块的变量并不是很常见,也不一定合理。
在 file1.py
中导入 file2
会让 file2
中定义的全局变量(也就是模块级别的变量)在 file1
中可用,唯一的这个变量就是 SomeClass
。但是,这并不意味着反过来也成立:在 file1
中定义的变量在 file2
中是不可用的,即使你用正确的方式导入(像 import file2
,正如 @nate 正确建议的那样),而不是你现在这种糟糕的方式(如果大家都忘记了 from ... import *
这个写法,生活会变得好很多)。
显然,你想让 file1
中定义的全局变量在 file2
中也能用,反之亦然。这种情况被称为“循环依赖”,这是个非常糟糕的主意(在 Python 中,或者在其他任何地方都是如此)。
所以,我宁愿告诉你如何避免这种糟糕的结构,而不是给你展示一些脆弱且难以维护的黑科技来实现(某种程度上的)循环依赖。
例如,你可以把需要在两个模块中都能使用的全局变量放到一个第三个模块中(比如 file3.py
,继续你的命名风格;-)),然后在另外两个模块中都导入这个第三个模块(在 file1
和 file2
中都写 import file3
),然后用 file3.foo
等方式来访问或设置这些全局变量,而不是直接用变量名。
当然,如果你能更清楚地说明(通过编辑你的问题)你为什么认为需要循环依赖,我可以提供更具体的帮助(有一点可以预测:无论你认为需要循环依赖的原因是什么,你都是错的;-)。