python函数中的截取局部赋值

python函数中的截取局部赋值,python,variable-assignment,assignment-operator,Python,Variable Assignment,Assignment Operator,我一直在玩Python中拦截全局赋值的游戏: class MyDict(dict): def __setitem__(self, k, v): print "intercepted assignment to ", k super(MyDict, self).__setitem__(self, k, v) nsG = MyDict() exec('a=10', nsG) 这将打印“截取的分配到一个”。酷!但是,这在函数内部不起作用: def f():

我一直在玩Python中拦截全局赋值的游戏:

class MyDict(dict): 
    def __setitem__(self, k, v):
        print "intercepted assignment to ", k
        super(MyDict, self).__setitem__(self, k, v)

nsG = MyDict()
exec('a=10', nsG)
这将打印“截取的分配到一个”。酷!但是,这在函数内部不起作用:

def f():
    # global a
    a = 10

exec("f()", nsG)
在那里,对
a
的赋值不会被截取(因为默认情况下,函数中的赋值是该函数的本地:
a
f
的本地赋值,因此
nsG
不被涉及;如果我在
f
中取消对
全局a
语句的注释,则会截取赋值,正如人们所期望的那样)


有没有办法截取函数中的本地赋值

否。在Python中,赋值不是运算符。最接近的方法是使用您已经完成的
\uuuuu setitem\uuuu
技巧,以及按键“分配”到自定义对象中。然后,您可以在
\uuuuu setitem\uuuuuuuu
内执行任何操作。是否要截取它并将其分配给用于全局的相同
nsG
?这将以不可预测的方式改变您执行的代码的行为,因为您将全局和局部存储在同一个目录中。此外,
globals
locals
在python中的行为不同。