一点想法
Topic sourcecounterA = 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('测试失败!')
执行过程分析:
counterA = createCounter()
执行此语句后,createCounter函数已被调用,counterA指向返回函数counter,且函数counter引用的变量i在createCounter中创建。
print(counterA(), counterA(), counterA(), counterA(), counterA())
执行函数counter五次,每执行一次修改同一个变量i,产生迭加效果。
counterB = createCounter() if [counterB(), counterB(), counterB(), counterB()] == [1, 2, 3, 4]: print('测试通过!') else: print('测试失败!')
又从1开始计数,因为再一次调用createCounter后返回的是一个新的函数counter
- 1
青铜神裔
先贴上答案:
一个错误的答案:
运行会出错:local variable 'i' referenced before assignment 这是因为对于createCounter函数,i是局部变量,对于counter函数,i是非全局的外部变量。当在counter中对i进行修改时,会将i视为counter的局部变量,屏蔽掉createCounter中对i的定义;如果仅仅在counter中对i进行读取,则不会出现这个错误。
另一个可行的方法是使用list:
python中list作为全局变量无需global声明,因此counter调用i[0]时会调用createCounter定义的list,也不会出错