假设起点从x=0
开始。
走了3
步,打印的结果result = 3
再走了5
步,打印的结果是result = 8
又走了6
步,打印的结果是result = 14
先用非闭包函数实现:
x = 0
def go(step):
global x
new_pos = x + step
x = new_pos
return x
print(go(3))
print(go(5))
print(go(6))
---------------------------------------------
输出:
3
8
14
这里为什么要用global
关键字来定义变量x
为全局变量呢?这是因为`在go
函数内部出现了x = new_pos
,而Python
会认为等号左边的变量是一个局部变量。如果没有使用global
关键字来定义x
为全局变量的话,new_pos = x + step
这行是会报错的。就会未定义x
变量。
在函数内部定义一个全局变量这个做法是不好的,因为全局变量是很容易被其他函数改变的。现在用闭包来实现
origin = 0
def factory(pos):
def go(step):
nonlocal pos
new_pos = pos +step
pos = new_pos
return new_pos
return go
f = factory(origin)
print(f(3))
print(f(5))
print(f(6))
----------------------------------
输出:
3
8
14
注意,用了
nonlocal
关键字来声明pos
变量不是本地的一个局部变量。
闭包的环境变量有保存现场的一个功能,它可以记忆上一次调用的状态。
定义的变量origin
的变量并没有被改变。