python的2.x版本中闭包各种写法

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())

猜你喜欢

转载自blog.csdn.net/everlasting_188/article/details/80538896
今日推荐