这里为什么必须返回L[0]才行,或者能不能改一下
def createCounter():
L = [0]
def counterA():
L[0]+=1
return L[0]
return counterA
# 测试:
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('测试失败!')
返回 1,2,3,4,5
这是一种元编程(netaprogramming)的手段,通过创建匿名对象,将上层的函数(createCounter)所定义的闭包变量L作为共享变量,起到计数器的作用。
之所以用数组,而不是直接用数字,是因为只有引用类型才能实现这种共享。否则你运行程序会得到一个无初始化引用的错误。
用数组最简单,当然根据这个原理,你传入任何有引用的对象都可以,比如可以这么写:
# -*- coding: UTF-8 -*-
class MyIntRef:
def __init__(self):
self.val = 0
def getval(self):
return self.val
def setval(self, x):
self.val = x
def createCounter():
L = MyIntRef()
def counterA():
L.setval(L.getval() + 1)
return L.val
return counterA
# 测试:
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('测试失败!')