一、首先需要确定闭包的定义
https://www.cnblogs.com/JohnABC/p/4076855.html?tdsourcetag=s_pctim_aiomsg
看以上的blog就可以了
二、 其次、掌握了基本的概念后,看我下面的解释就可以了
eg1:
def count():
fs = []
for i in range(1, 4):
def f():
return i*i
fs.append(f)
return fs
f1, f2, f3 = count()
print(count())
print (f1(),f2(),f3())
eg2:
def count():
fs = []
for i in range(1, 4):
def f(i):
return i*i
fs.append(f(i))
return fs
f1, f2, f3 = count()
print(count())
print (f1,f2,f3)
说明:
(1)对于上述的两个eg的闭包问题,为啥结果不一样呢??
正真需要确定的是count()函数里面的:f()函数的形参与临时变量的关系问题。
在eg1中,虽然有临时变量i,但是由于python的函数只有在执行时,才会去找函数体里的变量的值,也就是说你连形参都不确定,你咋求知道i为几呢?,在这里,你只需要记住如果你连形参都不确定,python就只会记住最后一个i值。
(2)而在eg2中,你在f(i)中很明确的写出了形参是i,那么python就会依次进行正确的赋值!!
(3)所以结论是,写python,需要明确是形参,就把形参写出来,不写形参,纯写临时变量很容易出现问题,因为谁知道你是谁???
(4)其次,需要注意的是,count(),f()函数什么时候传递地址,什么时候传递值??
就那eg1说吧,你输出print(count()),就是列表[],而列表中是放的是f,f是函数名,就是地址,那么最后输出的就是地址(看第一行结果);
eg2同理,你输出print(count()),就是列表[],而列表中是放的是f(i),f(i)是函数的值,得到的是数字,那么你最后输出的就是数值
所以,由于在eg1中输出的是地址,要写成f1()才能输出值(加了一个括号);在eg2中可以直接输出值,即f1。
所以,如果你输出:print(count),结果只会是地址而已啦。。。
三、 最后、如果你看了一中的讲解,我需要说明一个问题就是,在下面这块内容中,
用红框圈出来的地方是有问题的,你的keep赋值没问题,但是给file_nume形参赋值,是不能这么做的,只能将这个值在函数内赋值好,就是把名字的赋值要写在the_filter()函数的上面才行!
why?
因为下面这样赋值是不成立的!
正确的赋值方式如下:
要么在形参内赋值,要么就是按照eg2那样的方式去给里面函数的变量赋值