从模块中的函数内访问模块级变量

den*_*mat 45 python

我希望能够做到这样的事情:

#mymodule
var = None

def load():
    var = something()
Run Code Online (Sandbox Code Playgroud)

其他模块:

#secondmodule
import mymodule
mymodule.load()

#thirdmodule
from mymodule import var
print var #Shouldn't be None
Run Code Online (Sandbox Code Playgroud)

但我不知道如何从模块中定义的函数引用模块变量.

这可能吗?或者我需要在每个我不想使用它的地方发布全球声明.还是我完全错了?

Evp*_*pok 64

只是改变

def load():
    global var
    var = something()
Run Code Online (Sandbox Code Playgroud)

全局变量从兄弟方法是只读的.更准确地说,除非将变量指定为全局变量,否则Python会将其视为本地变量,但如果本地范围中不存在该名称,则对本地变量名称的读访问权将达到模块级范围.

另请参阅在pythondoc中使用"global"关键字以获取有关该global语句的更多详细信息

  • @schlamar这是个玩笑吗?这是丑陋的,新手不会比"全局"更好地理解它,它不必要地暴露复杂的模块机制,它需要导入`sys`,所有这一切只是为了遵守一个可疑的教条,并且上帝的话说"愚蠢的一致性是小脑袋的大人物." 我更喜欢"全球". (19认同)
  • @schlamar感谢教条.但不,全局变量有完全合理的用例.反正这不是问题. (7认同)
  • @schlamar在这个特殊情况下我在家里为自己写了一个小工具并遇到了这个问题.为了时间的利益,这不是一个关键的软件全局变量是好的.我同意Evpok的观点,即使在更大的项目中,全球化的时间和地点也非常少.更多的是因为python如何工作,这些并不是真正的"全局". (2认同)

kin*_*all 16

你似乎主要拥有它.您只缺少"模块级"变量在Python中称为全局变量的事实.(换句话说,它们不是真正的全局性,而只是声明它们所声明的模块的全局性.)

修改全局变量的任何函数中(您希望使名称引用另一个对象),必须将其声明为全局变量.所以你的load()功能global var在开始时需要一个.如果您只使用全局变量的值,或者它是一个可变类型(如列表)而您正在修改它,但不更改该名称所指向的对象,则无需将其声明为全局变量.

import正如您所发现的那样,该语句是如何将模块级变量从一个模块导入另一个模块的.

  • 这回答了我的疑问,`。如果您仅使用全局变量的值,或者如果它是可变类型(例如列表)并且您正在修改它,但不更改名称指向的对象,则无需将其声明为全局变量。`谢谢@kindall! (2认同)