2.x版本不支持noloacl,闭包各种使用方法如下:
'''
闭包相关的测试
https://stackoverflow.com/questions/3190706/nonlocal-keyword-in-python-2-x
http://cndenis.iteye.com/blog/1754743
'''
def outer():
def inner():
inner.y += 1
return inner.y
inner.y = 0
return inner
def outer2():
d = {'y' : 0}
def inner():
d['y'] += 1
return d['y']
return inner
def outter3():
x = {}
x[0] = 1
def inner():
print("inner is called, x=", x[0])
x[0] = x[0] + 1
print("outter after inner called, x=", x[0])
return inner
class C(object):
pass
def outter4():
x = C()
x.v = 1
def inner():
print("inner is called, x=", x.v)
x.v = x.v+1
print("outter after inner called, x=", x.v)
return inner
#2.75闭包中nolocal设置
if __name__ == '__main__':
f = outer()
g = outer()
print(f(), f(), g(), f(), g()) #prints (1, 2, 1, 3, 2)
h = outer2()
print(h(), h(), h()) # prints 1 2 3
h1 = outter3()
print(h1(),h1(),h1())
h2 = outter4()
print(h2(), h2(), h2())