再用闭包解决

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

results matching ""

    No results matching ""