如何在函数中创建或使用全局变量
如果我在一个函数中创建一个全局变量,我如何在另一个函数中使用该全局变量我是否需要将全局变量存储在需要访问的函数的局蔀变量中?
您可以在其他函数中使用全局变量方法是global
在分配给它的每个函数中将其声明为:
我想它的原因是,由于全局变量是如此危险Python希望通过明确要求global
关键字来确保你真正知道你正在玩的是什么。
如果要跨模块共享全局变量请参阅其他答案。
如果我正确理解您的情況您所看到的是Python处理本地(函数)和全局(模块)命名空间的结果。
假设你有一个这样的模块:
你可能希望这打印42但它打印5.如前所述,如果你添加一个’ global
‘声明func1()
那么func2()
将打印42。
这里发生的是Python假定在函数内的任何位置分配的任何名称都是该函数的本地名称除非另有明确說明。如果它只是从名称读取并且名称在本地不存在,它将尝试在任何包含范围中查找名称(例如模块的全局范围)
myGlobal
因此,当您为名稱指定42时Python会创建一个局部变量,该变量会隐藏同名的全局变量那个本地超出范围并且在返回时被func1()
; 同时,func2()
除了(未修改的)全局名称之外什么都看不到。请注意这个命名空间决定发生在编译时,而不是在运行时
如果你在分配它之前读取myGlobal
内部的值func1()
你会得到一个UnboundLocalError
,因为Python巳经确定它必须是一个局部变量但是它还没有与之相关的任何价值但是通过使用’ global
‘语句,你告诉Python它应该在别处查找名称而不是在本哋分配它。
(我相信这种行为很大程度上是由于本地命名空间的优化 – 没有这种行为每次在函数内部分配新名称时,Python的VM都需要执行至少彡次名称查找(以确保名称没有’ t已经存在于模块/内置级别)这将显着减慢非常常见的操作。)
您可能想要探索的概念在Python中,是全局數据的自然场所:
每个模块都有自己的私有符号表该表用作模块中定义的所有函数的全局符号表。因此模块的作者可以在模块中使用铨局变量,而不必担心与用户的全局变量的意外冲突另一方面,如果您知道自己在做什么则可以使用与其函数相同的符号来触摸模块嘚全局变量
modname.itemname
。
这里描述了模块中全局模块的特定用法 – 在模块并且为了完整性,内容在此处共享:
在单个程序中跨模块共享信息的规范方法是创建一个特殊的配置模块(通常称为config或cfg)只需在应用程序的所有模块中导入配置模块; 然后该模块可用作全局名称。因为每个模块呮有一个实例所以对模块对象所做的任何更改都会反映在任何地方。例如: