好吧,所以我有一个非常讨厌的问题,其中一个变量在本地设置,但然后在该函数之外恢复到它的旧自我(在这种情况下为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)
请注意所有的操作foo和foo_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)
当您对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)