搞不清楚在闭包(closures)中Python是怎样绑定变量的

看这个例子:

>>> def create_multipliers():
...   return [lambda x : i * x for i in range(5)]
>>> for multiplier in create_multipliers():
...   print multiplier(2)
...

期望得到下面的输出:

0 2 4 6 8

但是实际上得到的是:

8 8 8 8 8

实例扩展:

# coding=utf-8
__author__ = 'xiaofu'
 
# 解释参考 http://docs.python-guide.org/en/latest/writing/gotchas/#late-binding-closures
 
def closure_test1():
 """
 每个closure的输出都是同一个i值
 :return:
 """
 closures = []
 for i in range(4):
  
 def closure():
 print("id of i: {}, value: {} ".format(id(i), i))
 
 closures.append(closure)
 
 # Python's closures are late binding.
 # This means that the values of variables used in closures are looked up at the time the inner function is called.
 
 for c in closures:
 c()
 
def closure_test2():
 
 def make_closure(i):
 
 def closure():
 print("id of i: {}, value: {} ".format(id(i), i))
 
 return closure
 
 closures = []
 
 for i in range(4):
 closures.append(make_closure(i))
 
 for c in closures:
 c()
 
 
if __name__ == '__main__':
 closure_test1()
 closure_test2()

输出:

id of i: 10437280, value: 3
id of i: 10437280, value: 3
id of i: 10437280, value: 3
id of i: 10437280, value: 3
id of i: 10437184, value: 0
id of i: 10437216, value: 1
id of i: 10437248, value: 2
id of i: 10437280, value: 3

到此这篇关于Python新手如何进行闭包时绑定变量操作的文章就介绍到这了,更多相关Python闭包时绑定变量实例内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!