python中的闭包问题

版权声明:扫我头像就可以向我提问,共同提高:) https://blog.csdn.net/u011436427/article/details/87885707
一、首先需要确定闭包的定义

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那样的方式去给里面函数的变量赋值
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/u011436427/article/details/87885707