2011-12-05 36 views
1

好的我正在做一些线程,我猜想当我开始进行线程化时,我认为你不能像定义那样返回值(它是一天的结束,我的大脑是即将死去,所以也许这是不正确的,我应该开始要回摆脱全局变量)全局变量和模块(简单示例帮助)Python

反正我有一个测试程序,以弄清楚为什么我不能模块化我的代码

一个文件名为config .py

a_variable=0 

一个名为test_for_sean.p的文件Ÿ

from config import * 
def blah(): 
    global a_variable 
    a_variable=14 
    return 0 

一个名为main.py文件

from config import * 
from test_for_sean import * 
print a_variable #this prints correctly 
blah() 
print a_variable #this is still printing 0.... 

有人联系我的东西,所以我不杀了自己

+0

我不建议做一个'''import *'''。也许'''将test_for_sean导入为tfs'''。这会导致各种各样的问题 - 比如config.py是如何执行两次的,它会填充它导入的两个脚本的全局命名空间。 – FakeRainBrigand

+0

@FakeRainBrigand我在看这个http://www.etsimo.uniovi.es/python/infogami-faq/programming/how-do-i-share-global-variables-across-modules/是否真的错了? –

+0

我的错误。我在config.py中使用''print''进行测试,它只运行一次。 – FakeRainBrigand

回答

3

尝试这些变化,

config.py,

a_variable = 0 

tfs.py(was te st_for_sean),

import config 

def blah(): 
    config.a_variable = 14 
    return 0 

main.py,

import tfs, config 

print config.a_variable 
tfs.blah() 
print config.a_variable 

我们还是进口一切从配置,但 '全局' 变量留在自己的模块。这样我们就可以拥有全局变量,但是如果需要的话main.py仍然可以定义自己的a_variable

+0

我修正了上面的代码(感谢Sean的链接)。现在它没有全局性地工作。只要'''导入配置''任何地方你想要使用它。 – FakeRainBrigand

+0

工作,让我看看如果我可以扩展它,我喜欢更好的模块化!谢谢你,我很伤心,但我只有一个愿意付出。 –

4

从模块中导入变量时,名称被导入当前模块的名称空间,它们不是在两个模块之间共享。关键字global不允许您在模块之间共享名称,它只允许您为该模块分配一个全局范围内的名称。

要真正共享模块之间的变量,你需要通过它的模块来访问变量:

一个名为config.py

a_variable=0 

一个名为test_for_sean.py

import config 
def blah(): 
    config.a_variable=14 
    return 0 

文件文件一个名为main.py的文件

import config 
from test_for_sean import blah 
print config.a_variable # prints 0 
blah() 
print config.a_variable # prints 14 
1

有一个文件系统的类比。这不是一个完美的比喻,但有助于快速了解问题。

模块就像保存文件的目录,这些文件代表变量和其他对象。在模块中使用相对路径。只要写下绝对路径,图片就会清晰。

你的出发点是:

/my_app/module1/ 
/my_app/module1/a_variable 
/my_app/module2/ 

答:如果您在模块2这样做:

import a_variable from module1 

你正在变a_variable的副本:

/my_app/module1/ 
/my_app/module1/a_variable 
/my_app/module2/ 
/my_app/module2/a_variable 

在在这种情况下,当变量不可变时,它们将在第一次修改时不同步。

B.但是,当你这样做,而不是:

import module1 

你正在创建通往变量路径的副本:module1.a_variable

/my_app/module1/ 
/my_app/module1/a_variable 
/my_app/module2/ 
/my_app/module2/module1 -> ../module1 

结果是两个模块相同的变量。