关于闭包易错点的分析和总结
Topic sourcef1, f2, f3 = count()
这个地方我看不懂,这不是相当于
f1= count()
f2=count()
f3=count()
为什么跟循环有关。运行到return不是都加三个函数到fs 了嘛?
我零基础所以不太懂T.T
"""
count()的值就是调用count函数得到的返回值fs
而fs又是由三个未经调用的函数对象构成的列表
[<function count.<locals>.f at 0x0000020E3DB09AF0>, <function count.<locals>.f at 0x0000020E3DB09B80>, <function count.<locals>.f at 0x0000020E3DB09C10>]
f1, f2, f3 = count()这样赋值叫拆包
相当于:
f1 = count()[0]
f2 = count()[1]
f3 = count()[2]
相当于:
f1 = fs[0]
f2 = fs[1]
f3 = fs[2]
"""
# 另外关于赋值
# 可以连等:a=b=c=1
# 可以用可迭代对象拆包分别赋值:a,b,c = 1,2,3相当于a,b,c=[1,2,3]相当于a,b,c = (1,2,3)
# 变量前加*号代表可变长度,则有
# >>> a, *b, c = [1, 2, 3, 4]
# >>> print(a, b, c)
# 1 [2, 3] 4
我个人理解:
一、函数定义时,并不会保留外部变量的值,而for循环中,正是在定义函数
二、函数返回时,才将相关变量都保存在返回的函数中,此时for循环已经执行完毕
三、函数调用时,才会访问相关变量的值,i = 3
但是!!!函数定义时其实是有一个地方可以保存变量的值的,那就是作为默认参数的默认值
比较简单的写法:
def count():
fs = []
for i in range(1, 4):
def f(n=i): # 将变量值作为默认参数的值
return n * n
fs.append(f)
return fs
请做一下下面这道题:
L = [lambda : x ** 2 for x in range(1, 4)]
抱歉,按照上面那种写法就不是闭包函数了,大家注意一下。
def count():
fs = []
for i in range(1, 4):
def f(n=i): # 将变量值作为默认参数的值
return n * n
fs.append(f)
return fs
c = count()
for i in c:
print(i.__closure__) # None None None
- 1
凡响skyline