Discuss / Python / 一点想法

一点想法

Topic source

青铜神裔

#1 Created at ... [Delete] [Delete and Lock User]

先贴上答案:

def createCounter(): i=0 def counter(): nonlocal i i += 1 return i return counter

一个错误的答案:

def createCounter(): i=0 def counter(): i += 1 return i return counter

运行会出错:local variable 'i' referenced before assignment 这是因为对于createCounter函数,i是局部变量,对于counter函数,i是非全局的外部变量。当在counter中对i进行修改时,会将i视为counter的局部变量,屏蔽掉createCounter中对i的定义;如果仅仅在counter中对i进行读取,则不会出现这个错误。

另一个可行的方法是使用list:

def createCounter(): i=[0] def counter(): i[0] += 1 return i[0] return counter

python中list作为全局变量无需global声明,因此counter调用i[0]时会调用createCounter定义的list,也不会出错

青铜神裔

#2 Created at ... [Delete] [Delete and Lock User]

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('测试失败!')

执行过程分析:

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

Reply