前言
最近python学习到了包装函数,说真的,这部分内容一开始真的有点难理解。
问题
遇到一道很简单的练习题:(附上代码)
利用闭包返回一个计数器函数,每次调用它返回递增整数
def createCounter():
ans = [0]
def counter():
ans[0] += 1
return ans[0]
return counter
一开始,我是这样写的:
def createCounter():
n = 0
def counter():
n = n + 1
return n
return counter
结果报错了,琢磨了好久,发现原来内层函数只可以调用外层函数中定义的变量,但不能对其进行更改(内层函数对于外层函数中的变量只有读权限,没有写权限)。如果想要更改,系统会认为要更改的是内层函数中一个相同名字的变量(内层函数中可以使用一个与外层函数中名字完全相同的变量),所以在counter内创立一个新的变量n,而这个变量n没有初始化,因此报错了。
解决方法
看了别人的分析之后,收集了三种解决方法:
1.将x定义为global,全局命名空间在任何一个位置都有读写权限,但问题是在任何地方都可以对其修改。
def createCounter():
global x
x=0
def counter():
global x
x += 1
return x
return counte
2.将外层函数中的x定义为list。在内层使用x[0]+=1时,list的指向不会发生变化,变化的是list内部的元素。
def createCounter():
x = [0]
def counter():
x[0] += 1
return x[0]
return counter
3.设置一个指向可变对象list的默认参数。思路与2一样,只要参数一直等于默认参数,就会始终指向同一个list的地址,变化的是list内部的元素。
def createCounter():
def counter(x=[0]):
x[0] = x[0]+1
return x[0]
return counter