Python中的locals函数

命名空间

我们都知道python中有全局变量和局部变量,python在搜索变量时,会从命名空间中搜索,命名空间可以分为下面三类:

  • 局部命名空间: 函数或类中定义的变量所处的空间
  • 全局命名空间: 模块所在的空间
  • 内置命名空间: 内置命名空间,全局可用

python查找变量的顺序:局部>全局>内置
一旦找到相应的变量,即停止查找。

locals的定义

locals()函数不需要参数,会以字典类型返回当前位置的全部局部变量。

例如:

1
2
3
4
5
6
7
def test(x):
y = "123"
print(locals())

test(2)
------output--------
{'x': 2, 'y': '123'}

locals处于模块作用域时的效果跟globals时是一样的。
但是当locals处于函数作用域时却跟globals时表现不一致:

1
2
3
4
5
6
7
8
def print_y():
y = "abc"
locals()["y"] = "hello world"
print(y)

print_y()
----output------
"abc"

这是为什么呢?根据locals文档中的解释,不应该修改locals()返回的字典,因为可能影响局部变量的值或被解释器引用的自由变量。技术层面的解释可以参考这篇文章

你的支持我的动力