defsetupSomeGlobals(): '''多个函数绑定同一个闭包,因为他们定义在同一个函数内。''' num = [666] defget_num(): print"num:", num defadd_num(): num[0] += 1 defset_num(x): num[0] = x global getnum getnum = get_num global addnum addnum = add_num global setnum setnum = set_num setupSomeGlobals() getnum() addnum() getnum() setnum(10) getnum()
注意这个例子中使用py2有坑,见这里。如果你定义一个比如整型这种不可变类型,则在py2中报错“UnboundLocalError: local variable ‘num’ referenced before assignment”。解决办法就是定义列表、字典甚至类,在py3中使用nonlocal关键字。
例子3:当在一个循环中赋值函数时,这些函数将绑定同样的闭包
1 2 3 4 5 6 7 8 9 10 11 12
defbuildlist(mylist): '''当在一个循环中赋值函数时,这些函数将绑定同样的闭包,可以理解为上一个例子的变体''' result = [] for one in mylist: item = "item:%s" % one result.append(lambda :(item,one)) return result deftestlist(): fnlist = buildlist([1,2,3]) for i in fnlist: print i() testlist()