我什么时候需要在python中使用global关键字

时间:2012-08-08 14:58:43

标签: python

好吧,所以我有一个非常恼人的问题,其中一个变量在本地设置,但然后在该函数之外恢复到它的旧自我(在这种情况下为None),但同时我可以操纵其他变量仍然可以不使用“global”关键字。

我无法为此提供真实的代码,但它是这样的:

foo = {}
foo_foo = {}
bar = None


def changes_foo():
    ...do some stuff to foo...

class EditThread(threading.Thread):

    def __init__(self):
        setup()

    def run(self):
       for key, value in foo.items():
           do_update_task(key, value)

    def do_update_task(self, key, value):
         ...do some editing too foo...
         del foo[key]
         bar = [key, value]
         foo_foo[key] = value

def print_the_bar():
    print bar 

请注意foofoo_foo上的所有操作都运行正常,但是当我拨打print_the_bar时,条形码仍为无,而且我的帖子中有很多打印语句用于验证do_update_task内的栏确实具有正确值且不是None的代码。

有人可以向我解释为什么会这样吗?

4 个答案:

答案 0 :(得分:9)

如果您只需读取函数中全局变量的值,则不需要global关键字:

x = 3
def f():
    print x

如果设置全局变量的值,则需要关键字以便不创建局部变量:

x = 3
def f():
    global x
    x = 5

f()
print x

答案 1 :(得分:7)

当您对foo和foo_foo执行操作时,您不会更改引用:

foo = {}
foo['key'] = 'stuff'

foo仍然引用与以前相同的对象;它现在包含更多数据。

bar = ['key', 'value']

重新分配 bar以引用新对象(包含两个元素的列表)。

但是,当在函数内部遇到该行时,除非您说bar,否则会创建本地引用global bar。实际上,您有两个名为bar的变量:全局变量和本地变量。

global bar告诉Python使用bar的全局版本而不是创建一个具有相同名称的新局部变量。

通常,如果要修改全局变量,则应为每个变量声明global varname,以避免意外创建本地变量。

或者,你可以使用一个类:

class State(object):
    def __init__(self):
        self.foo = {}
        self.foo_foo = {}
        self.bar = None

state = State()

def fn():
    state.bar = ['key', 'value']

答案 2 :(得分:0)

您在函数中定义的变量只能从此函数的主体访问。

答案 3 :(得分:0)

您可以从函数中读取全局范围中的变量,但是如果不使用“global”关键字,则无法修改它们的值。

当您尝试设置bar =[key, value]时,会在函数的命名空间中添加一个新的bar变量。从那时起,bar引用了这个新变量,而不是全局变量。

虽然您可以阅读全局bar的值,但是一旦您尝试从函数中重新赋值,您实际上已经创建了一个新的bar并且没有采取行动全球性的。