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

2 投票
3 回答
1929 浏览
提问于 2025-04-17 07:46

好的,我在做一些线程相关的工作。我想当我开始学习线程的时候,我以为像定义函数那样是不能返回值的(今天已经很晚了,我的脑袋快要炸了,所以这可能是我理解错了,我应该开始回去看看怎么去掉全局变量)。

不管怎样,我有一个测试程序,想搞清楚为什么我不能把代码模块化。

有一个文件叫做 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 个回答

2

这里有一个类比,可以帮助你更快理解这个问题,虽然它不是完美的。

模块就像是文件夹,里面放着文件,而这些文件代表了变量和其他对象。在模块中,你使用的是相对路径。只要写出绝对路径,事情就会变得清晰。

你的起点是:

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

A. 如果你在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

这样的话,在两个模块中得到的都是同一个变量。

6

当你从一个模块导入变量时,这些变量的名字会被放到当前模块的命名空间里,它们并不是在两个模块之间共享的。使用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
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的变量。

撰写回答