在Python中修改freevars不起作用?

在Python中修改freevars不起作用?,python,closures,Python,Closures,我试图将一个整数变量附加到任何exist函数,以记录调用它的次数。为了做到这一点,我写下了下面的装饰 def count(fun): n = 0 def wrapper(*args, **kwargs): n += 1 print "%s called %d times" % (fun.func_name, n) fun(*args, **kwargs) return wrapper 但它不起作用,因为内部函数包装中的n在外部作用域计数中不被视为相同的n。我

我试图将一个整数变量附加到任何exist函数,以记录调用它的次数。为了做到这一点,我写下了下面的装饰

def count(fun):
  n = 0
  def wrapper(*args, **kwargs):
    n += 1
    print "%s called %d times" % (fun.func_name, n)
    fun(*args, **kwargs)
  return wrapper
但它不起作用,因为内部函数包装中的n在外部作用域计数中不被视为相同的n。我想知道为什么会这样

我知道我可以绕过这个限制的一种方法是使用可变容器(如列表)将数字n放入其中。

这对我很有用:

def count(fun):
    def wrapper(*args, **kwargs):
        wrapper.n += 1
        print("%s called %d times" % (fun.__name__, wrapper.n))
        fun(*args, **kwargs)
    wrapper.n = 0
    return wrapper

@count
def test():
    print('hello')

def main():
    for i in range(5):
        test()

if __name__ == '__main__':
    main()
这对我很有用:

def count(fun):
    def wrapper(*args, **kwargs):
        wrapper.n += 1
        print("%s called %d times" % (fun.__name__, wrapper.n))
        fun(*args, **kwargs)
    wrapper.n = 0
    return wrapper

@count
def test():
    print('hello')

def main():
    for i in range(5):
        test()

if __name__ == '__main__':
    main()

在Python 3中,您将使用
非本地
关键字(与
全局
相反):


但我从您的代码中猜测您正在寻找Python 2解决方案。

在Python 3中,您将使用
非本地
关键字(与
全局
相反):


但我从您的代码中猜测您正在寻找Python 2解决方案。

是的,我正在使用Python2,我们的团队明年将切换到Python3。是的,我正在使用Python2,我们的团队明年将切换到Python3。