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

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


您可以通过声明为使用其他功能的全局变量, 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.如前所述,如果你向func1()添加一个' global '声明,那么func2()将打印42。

def func1():
    global myGlobal
    myGlobal = 42

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

因此,当将42 myGlobal这个名称时,Python会创建一个局部变量来myGlobal相同名称的全局变量。 当func1()返回时,本地超出范围并被垃圾收集; 与此同时, func2()永远不会看到除(未修改)全局名称以外的任何内容。 请注意,这个命名空间决定发生在编译时,而不是运行时 - 如果您在分配给func1()之前先读取myGlobal的值, myGlobal得到一个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
链接地址: http://www.djcxy.com/p/595.html

上一篇: Using global variables in a function other than the one that created them

下一篇: What is a serialVersionUID and why should I use it?