技术背景
在Python中定义一个函数时,就会把变量空间划分为全局变量(global)与局部变量(local),如果是定义在一个类的成员函数中,那么就还有额外的成员变量(self)空间。那么,如果在实际操作中,想把这几种不同的变量空间做一个分离的话,有没有办法呢?
读取和修改局部变量
首先来看一下局部变量的读取,一般有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(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 =