用Python字符串访问与修改局部变量
读取和修改局部变量
首先来看一下局部变量的读取,一般有locals()、vars()和sys._getframe(0).f_code.co_varnames这几种方法,另外有一种sys._getframe(0).f_locals的方法,其实等价于locals(),相关的实现代码如下:
x = 0 class Obj: def __init__(self, y): self.func(y) def func(self, y, z=1): m = 2 print(locals()) print(vars()) print(__import__('sys')._getframe(0).f_code.co_varnames) if __name__ == '__main__': Obj(2) 该代码的运行结果如下:
{ 'self': <__main__.Obj object at 0x7f5cf5e74e50>, 'y': 2, 'z': 1, 'm': 2} { 'self': <__main__.Obj object at 0x7f5cf5e74e50>, 'y': 2, 'z': 1, 'm': 2} ('self', 'y', 'z', 'm') 在vars方法不加具体变量名的时候,就是等价于locals方法,两者返回的结果都是字典格式。如果是一个类中的成员函数下执行locals或者vars,会附带一个__main__.Obj object的变量,相当于所有self的成员变量,其实也是局部变量的一部分。而如果使用co_varnames的方法,那么得到的就是所有局部变量的名称,我们也可以在例子中额外定义一个self的成员变量:
x = 0 class Obj: def __init__(self, y): self.p = 5 self.func(y) def func(self, y, z=1): m = 2 print(locals()) print(vars()) print(__import__('sys')._getframe(0).f_code.co_varnames) if __name__ == '__main__': Obj(2)