python – 在创建它们的函数中使用全局变量

如果我在一个函数中创建一个全局变量,如何在另一个函数中使用该变量?
我是否需要将全局变量存储在需要访问的函数的局部变量中?


您可以在其他函数中使用全局变量,global方法是将其声明为在分配给它的每个函数中:

globvar = 0

def set_globvar_to_one():
    global globvar    # Needed to modify global copy of globvar
    globvar = 1

def print_globvar():
    print(globvar)     # No need for global declaration to read value of globvar

set_globvar_to_one()
print_globvar()       # Prints 1

我想其中的原因是,由于全局变量非常危险,因此Python希望通过明确地要求global关键字来确保您确实知道您正在玩的是什么。

如果您想跨模块共享全局变量,请参阅其他答案。


如果我正确理解你的情况,你所看到的是Python如何处理本地(函数)和全局(模块)命名空间的结果。

假设你有一个这样的模块:

# sample.py
myGlobal = 5

def func1():
    myGlobal = 42

def func2():
    print myGlobal

func1()
func2()

您可能会期望这打印42,而是打印5.如前所述,如果您添加一个“ global‘声明func1(),然后func2()将打印42。

def func1():
    global myGlobal
    myGlobal = 42

这里发生的事情是,Python假设在函数中的任何位置分配的任何名称都是该函数的本地名称,除非明确告知其他名称。如果只从名称中读取,并且名称不在本地,则它将尝试在任何包含的范围(例如模块的全局范围)中查找该名称。

myGlobal因此,当您为该名称指定42时,Python将创建一个局部变量,该局部变量会遮蔽同名全局变量。该地区超出范围,并在退货时收集垃圾func1() ; 与此同时,func2()除了(未修改的)全球名称之外,永远不会看到任何东西。请注意,这个命名空间的决定发生在编译时,而不是运行时 – 如果您在分配给它之前要读取myGlobalinside 的值func1(),您会得到一个UnboundLocalError,因为Python已经决定它必须是局部变量,但它还没有任何价值。但是通过使用’ global‘语句,你告诉Python它应该在别处寻找名称,而不是在本地分配它。

(我相信这种行为主要是通过优化本地命名空间而产生的 – 没有这种行为,每次在函数内部分配一个新名称时,Python的VM都需要至少执行三次名称查找(以确保名称不会被忽略) t已经存在于模块/内置级别),这将显着减慢非常常见的操作。)


你可能想要探索命名空间的概念。在Python中,模块全球数据的自然之处:

每个模块都有自己的专用符号表,它被模块中定义的所有功能用作全局符号表。因此,模块的作者可以在模块中使用全局变量,而不用担心与用户的全局变量发生意外冲突。另一方面,如果你知道自己在做什么,你可以使用与其功能相同的符号来触摸模块的全局变量modname.itemname

这里描述了模块中的全局变量的具体用法 – 模块间变量 – 如何分享 – 全局变量 – 跨模块

在单个程序中跨模块共享信息的规范方法是创建一个特殊的配置模块(通常称为config或cfg)。只需在应用程序的所有模块中导入配置模块; 该模块将成为全球名称。由于每个模块只有一个实例,因此对模块对象所做的任何更改都会反映到处。例如:

文件:config.py

x = 0   # Default value of the 'x' configuration setting

文件:mod.py

import config
config.x = 1

文件:main.py

import config
import mod
print config.x

添加评论

友情链接:蝴蝶教程