好吧,所以我有一个非常恼人的问题,其中一个变量在本地设置,但然后在该函数之外恢复到它的旧自我(在这种情况下为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
请注意foo
和foo_foo
上的所有操作都运行正常,但是当我拨打print_the_bar
时,条形码仍为无,而且我的帖子中有很多打印语句用于验证do_update_task
内的栏确实具有正确值且不是None的代码。
有人可以向我解释为什么会这样吗?
答案 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
并且没有采取行动全球性的。