什么时候需要在python中使用global关键字
好的,所以我遇到了一个非常烦人的问题,其中变量在本地设置,但是在该函数之外又恢复为旧的自身(在这种情况下为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
请注意,在foo
和上进行的所有操作都foo_foo
很好,但是当我调用bar时,bar仍然为None
print_the_bar
,并且我的代码中有很多打印语句,以验证bar内部do_update_task
的确具有正确的值并且不是None。
有人可以向我解释为什么会这样吗?
-
在对foo和foo_foo进行处理时,您不会更改引用:
foo = {} foo['key'] = 'stuff'
foo
仍然引用与以前相同的对象;现在它包含更多数据。bar = ['key', 'value']
这种 重新分配
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']