利用全局变量的性质,python在函数中调用全局变量,注意得加上global,同时无论在那里修改,都会全局影响;代码如下:
s = 0 #设置全局变量
def createCounter():
def counter():
global s #引用全局变量
s = s+1
return s
return counter
# 测试:
counterB = createCounter()
if [counterB(), counterB(), counterB(), counterB()] == [1, 2, 3, 4]:
print('测试通过!')
else:
print('测试失败!')
这个解答是借鉴一位前辈的,其实思路很简单,但是我们一般想的就是在外层函数设一个变量s = 0 ,然后内层函数对s做修改,但是如果这样写的话,会报UnboundLocalError: local variable ‘s’ referenced before assignment 错误,也就是s已经被定义了。
def createCounter():
s = 0
def counter():
s += 1
return s
return counter
# 错误信息
# UnboundLocalError: local variable 's' referenced before assignment
这是因为在函数内部对变量赋值进行修改后,该变量就会被python解释器认为是局部变量而非全局变量,当程序执行到s += 1的时候,因为这条语句是给s赋值,所以s成为了局部变量,那么在执行s += 1的时候,因为s这个局部变量还没有定义,自然就会抛出这样的错误。
下面这种做法是将s
def createCounter():
s = [0]
def counter():
s[0] = s[0]+1
return s[0]
return counter
这种做法就很巧妙,s[0] = s[0]+1 这句代码并没有直接对s赋值,而是更改的s中的内容,所以自然就可行了。