以前的一个同事起一个闭包相关的一道题,大家看看这个输出的结果应该是什么?

def a():
    li = []
    for i in range(1,4):
        def b():
            print('*'*30,i)
            return i**2
        li.append(b)
        print('~~~~')
    return li
a1,a2,a3 = a()

print(a1())
print(a2())
print(a3())

其实这个的输出结果是

~~~~
~~~~
~~~~
****************************** 3
9
****************************** 3
9
****************************** 3
9

惊不惊喜,意不意外?

怎么输出的是三个9而不是我们想象中的1 4 9?

你是因为我们传入列表里面的只是一个函数,而且是一个没有被调用的函数,

所以i的值和函数无关,和我们调用函数时候的i值有关,

那都是因为

li.append(b)

而不是

li.append(b())

后者是调用了b函数才会和i值相关

而我们使用b只是把b函数存起来,等待被调用所以就和i值无关,

查看一下debug就一目了然了
一个有趣的闭包题