在模块内函数中访问模块级变量

70 投票
2 回答
59891 浏览
提问于 2025-04-16 23:35

我想要做到这样的事情:

#mymodule
var = None

def load():
    var = something()

其他模块:

#secondmodule
import mymodule
mymodule.load()

#thirdmodule
from mymodule import var
print var #Shouldn't be None

但是我不知道怎么从模块里定义的函数去引用模块的变量。

这样做可能吗?还是说我需要在每个想用到这个变量的地方都加一个全局声明?

我是不是走错方向了?

2 个回答

24

你基本上理解得差不多了。你只需要知道一点,就是在Python中,“模块级别”的变量被称为全局变量。(其实它们并不是真正的全局变量,而只是对声明它们的模块来说是全局的。)

在任何一个函数里,如果你要修改一个全局变量(也就是想让这个变量指向一个不同的对象),你必须在函数里声明这个变量是全局的。所以你的load()函数开头需要加上global var。如果你只是使用全局变量的值,或者这个变量是可变类型,比如列表,你在修改它的内容,但不改变它指向的对象,那就不需要声明它是全局的。

你发现的import语句就是用来把一个模块里的变量引入到另一个模块里的方法。

95

只需要把函数的定义改成这样:

def load():
    global var # this line has been added to the original code
    var = something()

全局变量在兄弟方法中是只读的。更准确地说,除非一个变量被指定为全局变量,否则Python会把它当作局部变量来处理。但是,如果局部范围内没有这个变量名,访问局部变量时会查找模块级别的范围。

更多信息可以参考 Python中“global”关键字的使用文档,了解关于 global 语句的详细内容。

撰写回答