再用闭包解决
origin = 0
def factory(pos):
def go(step):
new_pos = pos+step
pos = new_pos
return new_pos
return go
tourist = factory(origin)
print(tourist(3))
print(tourist(5))
print(tourist(8))
Traceback (most recent call last):
File "/Users/scottxiong/Desktop/end/python/basic/enum/c6.py", line 12, in <module>
print(tourist(3))
File "/Users/scottxiong/Desktop/end/python/basic/enum/c6.py", line 5, in go
new_pos = pos+step
UnboundLocalError: local variable 'pos' referenced before assignment
origin = 0
def factory(pos):
def go(step):
nonlocal pos
pos += step
return pos
return go
tourist = factory(origin)
print(tourist(3))
print(tourist(5))
print(tourist(8))
3
8
16
尽量少的使用和改变全局变量,因为你吧全局变量改变了,那其他函数调用就没有任何意义了,这也是闭包的好处,一句话,闭包不会污染全局变量,jquery用到了大量的闭包
origin = 0
def factory(pos):
def go(step):
nonlocal pos
pos += step
return pos
return go
tourist = factory(origin)
print(tourist(3))
print(origin)
print(tourist.__closure__[0].cell_contents)
print(tourist(5))
print(origin)
print(tourist.__closure__[0].cell_contents)
print(tourist(8))
print(origin)
print(tourist.__closure__[0].cell_contents)
3
0
3
8
0
8
16
0
16