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

发布于 2021-01-29 16:15:00

好的,所以我遇到了一个非常烦人的问题,其中变量在本地设置,但是在该函数之外又恢复为旧的自身(在这种情况下为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。

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

关注者
0
被浏览
137
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    在对foo和foo_foo进行处理时,您不会更改引用:

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

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

    bar = ['key', 'value']
    

    这种 重新分配 bar是指一个新的对象(名单有两个元素)。

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

    Sayingglobal 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']
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看