说明
《Python 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
Python 的内置函数 locals() 更新并返回表示当前本地符号表的字典,它没有可传入的参数。 在函数代码块但不是类代码块中调用 locals() 时将返回自由变量。 请注意在模块层级上,locals() 和 globals() 是同一个字典。Python 的命名空间通过一种字典的形式来体现, 而具体到函数也就是 locals() 和 globals(), 分别对应着局部命名空间和全局命名空间。
一些示例如下:
# 在终端输入
locals()
# 输出(已美化格式)
{'__name__': '__main__',
'__doc__': None,
'__package__': None,
'__loader__': <class '_frozen_importlib.BuiltinImporter'>,
'__spec__': None,
'__annotations__': {},
'__builtins__': <module 'builtins' (built-in)>
}
# 1 对象没有__dict__ 属性
vars(1)
# TypeError: vars() argument must have __dict__ attribute
class Foo:
def __init__(self):
self.__dict__ = {'name':'Foo'}
f = Foo()
# 再终端执行
locals()
# 输出(已美化格式)
{'__name__': '__main__',
'__doc__': None,
'__package__': None,
'__loader__': <class '_frozen_importlib.BuiltinImporter'>,
'__spec__': None,
'__annotations__': {},
'__builtins__': <module 'builtins' (built-in)>,
'Foo': <class '__main__.Foo'>,
'f': <__main__.Foo object at 0x7fccf35f5120>
}
# 注意最后两项
我们进行赋值操作时,如 bar = 1,执行赋值语句后,名称 bar 引用到值 1,名字为键,将我们要取这个值时,可以用 vars() 返回的字典里用此键取得其引用值:
bar = 1
locals()['bar']
# 1
'bar' in locals().keys()
# True
注意:
不要更改此字典的内容,更改不会影响解释器使用的局部变量或自由变量的值。
以下是几个相关内置函数对比表:
函数 | 有参数 | 无参数 | 返回类型 |
---|---|---|---|
globals() | - | 当前作用域全局变量,可以更新 | dict |
locals() | - | 当前作用域的局部变量,不应该被修改 | dict |
vars([object]) | 对象属性,同 object.__dict__ |
同 locals(),可以更新 | dict |
dir([object]) | 对象的属性、方法(含特殊方法)名称 | 当前作用域中的名称 | list |
Python globals() locals() vars() 三个内置函数的区别:
更多:
__dict_
_ 属性注意:
locals 和 vars 需要再解释一下。如果在函数中调用了 locals(),它将使用当前局部变量名称空间(加上任何闭包变量)的值更新 dict,并返回它。在同一栈帧中多次调用 locals(),每次都返回相同的 dict——它作为 f_locals 属性附加到栈帧对象。dict 的内容在每次 locals() 调用和每个 f_locals 属性访问时更新,但仅在此类调用或属性访问时更新。分配变量时,它不会自动更新,在dict 中分配条目不会分配相应的局部变量:
import inspect
def f():
x = 1
l = locals()
print(l) # {'x': 1}
locals()
print(l) # {'x': 1, 'l': {...}}
x = 2
print(x, l['x']) # 2 1
l['x'] = 3
print(x, l['x']) # 2 3
inspect.currentframe().f_locals
print(x, l['x']) # 2 2
f()
# 输出
'''
{'x': 1}
{'x': 1, 'l': {...}}
2 1
2 3
2 2
'''
第一次 print(l) 只显示一个“x”条目,因为对l的赋值发生在 locals() 调用之后。再次调用 locals() 后的第二个 print(l) 显示了一个l条目,尽管我们没有保存返回值。第三次和第四次打印显示,赋值变量不会更新l,反之亦然,但在访问 f_locals 后,局部变量会再次复制到 locals() 中。
更新时间:March 27, 2022, 11:22 a.m. 标签:python locals 符号 字典