闭包的坑


# 闭包常见坑
def count():
# 定义列表,列表里存放的是定义的函数
  fs = []
  for i in range(1,4):
# 定义了一个函数f
# f是一个闭包结构
  def f():
    return i*i
    fs.append(f)
  return fs


f1,f2,f3 = count()
print(f1())
print(f2())
print(f3())

 
 

得出的结果不是想象的1,4,9,而是9,9,9,下面看改进后的函数

造成上述状况的原因是,返回函数引用了变量i, i并非立即执行,而是等到三个函数都返回的时候才统一使用,此时i已经变成了3,最终调用的时候,都返回的是 3*3

此问题描述成:返回闭包时,返回函数不能引用任何循环变量

解决方案: 再创建一个函数,用该函数的参数绑定循环变量的当前值,无论该循环变量以后如何改变,已经绑定的函数参数值不再改变

# 修改上述函数
def count2():
    def f(j):
        def g():
            return j*j
        return g
    fs = []
    for i in range(1,4):
        fs.append(f(i))
    return fs

f1,f2,f3 = count2()
print(f1())
print(f2())
print(f3())

  

 

posted on 2019-03-18 10:38  沈家大大  阅读(157)  评论(0编辑  收藏  举报