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

Dan*_*roa 5 python

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

我不能提供真正的代码,但它是这样的:

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 
Run Code Online (Sandbox Code Playgroud)

请注意所有的操作foofoo_foo工作正常,但是当我调用时,bar仍然是None print_the_bar,并且我的代码中有很多打印语句来验证内部的bar do_update_task确实具有正确的值而不是None.

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

che*_*ner 12

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

x = 3
def f():
    print x
Run Code Online (Sandbox Code Playgroud)

如果你曾经设置一个全局变量的值,你需要的关键字,这样你就不能创建一个局部变量:

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

f()
print x
Run Code Online (Sandbox Code Playgroud)

  • +1 简洁明了。另请参阅[this](/sf/ask/985691591/)了解这如何不像许多人期望的那样工作字典。 (2认同)

mrb*_*mrb 8

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

foo = {}
foo['key'] = 'stuff'
Run Code Online (Sandbox Code Playgroud)

foo仍然指的是与以前相同的对象; 它现在包含更多数据.

bar = ['key', 'value']
Run Code Online (Sandbox Code Playgroud)

将重新分配 bar以引用新对象(具有两个元素的列表).

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

Saying 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']
Run Code Online (Sandbox Code Playgroud)