提问人:gambarimas87 提问时间:6/25/2023 最后编辑:gambarimas87 更新时间:6/25/2023 访问量:57
Python 中 Local 命名空间的内容
Content of the Local namespace in Python
问:
我在 Python 文档的这一页中读到,函数的本地命名空间是在调用函数时创建的。
在下面的示例代码中,我使用 function 来获取 function 的本地命名空间(字典)。令我惊讶的是,这个函数返回的字典包括 identifier ,只有在我调用函数后才会出现在函数的主体中。locals()
g()
f_var
g()
locals()
# local_namespace_test.py
def f():
f_var = 55
def g():
g_var = 3
print(f"locals in g(): {locals()}")
print(f_var)
return
g()
return
f()
为什么函数的本地命名空间在这种情况下包含该名称?
为什么如果我删除该行,那么不在字典中返回 ?g()
f_var
print(f_var)
f_var
locals()
运行上述代码的输出:
$ python3 local_namespace_test.py
locals in g(): {'g_var': 3, 'f_var': 55}
55
运行上述代码的输出,并注释了行:print(f_var)
$ python3 local_namespace_test.py
locals in g(): {'g_var': 3}
答:
Python 将从内到外寻找变量。在这种情况下,您有一个“链式”调用堆栈。global -> f() -> g()
因此,引用了两个变量:和 . 也定义在 so 中,因此是一个局部变量,因此在 的内部命名空间中。g()
g_var
f_var
g_var
g()
g_var
g()
f_var
在语句中引用,但未在此处定义。因此,如果不同的命名空间包含对“堆栈”的引用并上升到“堆栈”,则 Python 将进行查找。该函数包含 和 的定义,因此将 中的命名空间条目复制到 。g()
print
f_var
f()
f_var
f_var
f()
g()
如果没有对 in 的引用(即省略 print 语句),则不会被复制到内部命名空间,因为 中不需要它。f_var
g()
f_var
g()
如果函数不包含 的定义,Python 将“进一步向上”查看,即在全局命名空间中,如果已定义。所以在这种情况下:f()
f_var
f_var
f_var=44
def f():
def g():
g_var = 3
print(f"locals in g(): {locals()}")
print(f"globals in g(): {globals()}")
print(f_var)
return
g()
return
f()
将返回
locals in g(): {'g_var': 3}
globals in g(): {'__name__': '__main__', [...] 'f_var': 44, 'f': <function f at 0x7f9286480e18>}
44
返回值将是 global ,它不在本地命名空间中,而是在全局命名空间中。f_var
评论