>>> def func():
... print("abc")
... return None
...
>>> my_func = func()
abc
>>> print(my_func)
None
>>> my_func
>>>
In [1]: def out_func():
...: def in_func():
...: print("in func")
...: return 100
...: return in_func
...:
...:
In [2]: f = out_func()
In [3]: print(type(f))
<class 'function'>
In [4]: print(f)
<function out_func.<locals>.in_func at 0x000001B9B99D6BF8>
In [5]: f()
in func
Out[5]: 100
In [6]:
>>> def out_func(*args):
... def in_func():
... rst = 0
... for i in args:
... rst += i
... return rst
... return in_func
...
>>> f1 = out_func(1, 2, 3, 4, 5)
>>> f1()
15
>>> f2 = out_func(6, 7, 8, 9, 10)
>>> f2()
40
>>> def out_func():
... res = []
... for i in range(1, 4):
... def in_func():
... return i * i
... res.append(in_func)
... return res
...
>>> f1, f2, f3 = out_func()
>>> f1()
9
>>> f2()
9
>>> f3()
9
>>>
返回函数引用了变量 i,i 并非立即执行,而是等到三个函数都返回的时候才统一使用,此时 i 已经变成了 3,最终调用的时候,返回的都是 3*3
由此可见:返回闭包时,返回函数不能引用任何循环变量
>>> def out_func():
... def in1(n):
... def in2():
... return n * n
... return in2
... res = []
... for i in range(1, 4):
... res.append(in1(i))
... return res
...
>>> f1, f2, f3 = out_func()
>>> f1()
1
>>> f2()
4
>>> f3()
9
>>>
原文:https://www.cnblogs.com/yorkyu/p/12074849.html