全局变量和模块(简单示例帮助)Python

时间:2011-12-05 23:05:44

标签: python import module global-variables

好的我正在做一些线程,我猜我开始做线程时我认为你不能像定义一样返回值(它的结束时间和我的大脑即将死亡所以也许这是不正确的我应该开始回去摆脱全局变量)

无论如何,我有一个测试程序来弄清楚为什么我不能模块化我的代码

一个名为config.py

的文件
a_variable=0

一个名为test_for_sean.py的文件

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....
有人把我联系起来,所以我不会自杀

3 个答案:

答案 0 :(得分:5)

从模块导入变量时,名称将导入到当前模块的命名空间中,两个模块之间 不会共享。 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 :(得分:4)

尝试这些更改,

config.py,

a_variable = 0

tfs.py(是test_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

我们仍然从config导入所有内容,但是'全局'变量保留在他们自己的模块中。这样我们就可以拥有全局变量,但是如果需要,仍然可以让main.py定义自己的a_variable

答案 2 :(得分:2)

与文件系统有类似之处。这不是一个完美的类比,但有助于快速理解问题。

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

您的出发点是:

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

一个。如果你在module2中这样做:

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

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