Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 修改局部变量()如globals(),将变量插入范围_Python_Python 3.x - Fatal编程技术网

Python 修改局部变量()如globals(),将变量插入范围

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

(我的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
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