Python 修改局部变量()如globals(),将变量插入范围
(我的python版本是Ubuntu 19.10上的3.7.0)Python 修改局部变量()如globals(),将变量插入范围,python,python-3.x,Python,Python 3.x,(我的python版本是Ubuntu 19.10上的3.7.0) locals()和globals()生成类似dict的对象,其中包含当前范围内的引用。将新密钥添加到globals()时,它将在全局范围内可用: # the first two lines can be deleted # they are just to make sure that I don't accidentally # have a definition of a left in global scope a = 1
locals()
和globals()
生成类似dict的对象,其中包含当前范围内的引用。将新密钥添加到globals()
时,它将在全局范围内可用:
# the first two lines can be deleted
# they are just to make sure that I don't accidentally
# have a definition of a left in global scope
a = 1
del a
globals().update({'a':1})
print(a) # prints 1
这也适用于函数定义内部。请注意,在定义函数时,没有全局变量a
。它仅在执行函数时创建:
del a
def fun():
globals().update({'a':1})
print(a)
fun() # prints 1
这不适用于局部变量()
奇怪的是,如果我定义了a,然后将其删除,则错误会发生变化:
def fun():
a = 1
del a
locals().update({'a':1})
print(a) # UnboundLocalError: local variable 'a' referenced before assignment
fun()
而且,尽管可以更新globals()
,然后访问函数中的新引用,但一旦同名引用在某个点上位于本地范围内,这就不再可能了:
def fun():
a = 1
assert 'a' in locals()
del a
assert 'a' not in locals()
globals().update({'a':1})
print(a) # UnboundLocalError
fun()
另一个测试是关于函数外全局范围内locals()
的行为:
a = 1
del a
locals().update({'a':1})
print(a) # prints 1
这里的语义是什么?为什么错误消息在NameError和UnboundLocalError之间变化?是否可以将引用插入本地作用域?
locals
提供本地作用域的表示,而不一定是它的接口。但是在全局作用域中,locals()
的行为与globals
的行为相同,全局作用域就是局部作用域。局部作用域的好处之一是可以更快地访问局部值,因为可以在编译时确定作用域中的名称。能够在运行时修改这组名称将破坏这一优势。
a = 1
del a
locals().update({'a':1})
print(a) # prints 1