Python:'global'与globals().update(var)的区别

17 投票
1 回答
17578 浏览
提问于 2025-04-15 15:11

将一个变量初始化为 global var 和使用 globals().update(var) 之间有什么区别呢?

谢谢

1 个回答

31

当你说

global var

时,你是在告诉Python,var是一个在全局范围内定义的变量。你可以这样使用它:

var=0
def f():
    global var
    var=1
f()
print(var)
# 1  <---- the var outside the "def f" block is affected by calling f()

如果没有global这个声明,"def f"块里面的var就会是一个局部变量,给它赋值不会影响到"def f"块外面的var。

var=0
def f():
    var=1
f()
print(var)
# 0  <---- the var outside the "def f" block is unaffected

当你说globals.update(var)时,我猜你其实是想说globals().update(var)。我们来拆开讲讲。

globals()会返回一个字典对象。这个字典的键是对象的名字,而字典的值则是对应对象的值。

每个字典都有一个叫做"update"的方法。所以globals().update()就是在调用这个方法。这个update方法至少需要一个参数,而这个参数应该是一个字典。如果你告诉Python

globals().update(var)

那么var最好是一个字典,你就是在告诉Python用var字典的内容来更新globals()字典。

举个例子:

#!/usr/bin/env python

# Here is the original globals() dict
print(globals())
# {'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__file__': '/home/unutbu/pybin/test.py', '__doc__': None}

var={'x':'Howdy'}
globals().update(var)

# Now the globals() dict contains both var and 'x'
print(globals())
# {'var': {'x': 'Howdy'}, 'x': 'Howdy', '__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__file__': '/home/unutbu/pybin/test.py', '__doc__': None}

# Lo and behold, you've defined x without saying x='Howdy' !
print(x)
Howdy

撰写回答