def createCounter():
i=0
def counter():
nonlocal i
i=i+1
return i
return counter
#测试代码
counterA= createCounter()
print(counterA(), counterA(), counterA(), counterA(), counterA()) # 1 2 3 4 5
counterB = createCounter()
if [counterB(), counterB(), counterB(), counterB()] == [1, 2, 3, 4]:
print('测试通过!')
else:
print('测试失败!')
关于为什么要用nonlocal,附上看到的一段经典解释;
因为count指向的是一个列表的实例对象,实质上,列表的实例对象的地址一直没变,只是其内容的指向改变了而已,而nonlocal关键字用来在函数或其他作用域中修改外层(非全局)变量,global关键字则是用于修改全局变量,关键就在于内层函数可以访问外层的值,但不能修改其指向。需要访问并修改外层变量需要视情况使用global或nonlocal。