11-12闭包的定义

来源:11-13 闭包的经典误区

天上掉下个小馅饼

2018-07-18

老师老师,我在后面的学习中,出现了这样的问题:

1、为什么这个是属于闭包呢,我在里面引用了x了耶http://img.mukewang.com/szimg/5b4ea996000123ca07700516.jpg

2、为什么我把return修改之后他就不是闭包了呢,不是说跟return无关的吗

http://img.mukewang.com/szimg/5b4ea9e200012d2706690508.jpghttp://img.mukewang.com/szimg/5b4eaa2500011fc907060507.jpg

麻烦老师了

写回答

3回答

光荣交白卷哥

2018-08-02

我对你这个问题有解答的,第一个为什么是闭包的原因是:你在go函数里面引用了pos这个变量,并且使用了他,所以形成了闭包,而pos是在外围的factory函数里面进行定义的,执行一下print(t.__closure__[0].cell_contents)这个语句,你就会发现结果是0,而pos在函数调用的使用,被origin替换,被换成了0,所以打印为0,而后两个图都不是闭包的原因是没有引用pos这个外部定义的变量,自然不是闭包

ps:我想撤回我之前的回答,我感觉好像错了

2
2
光荣交白卷哥
今天看了一下今年8月自己的回答 我已经看不懂自己写的什么了 好惊恐
2019-02-15
共2条回复

光荣交白卷哥

2018-08-02

origin = 0 


def factory(pos):
x = 10 

def go():
x = 20 
print(pos)
return go
tourist = factory(origin)
print(tourist)
print(tourist.__closure__)


1
0

7七月

2018-07-19

你咋说 没有return就不是闭包了呢,是基于什么判断的?

0
6
光荣交白卷哥
回复
蒋一筒
用上面的例子来说,tourist = factory(origin)这个操作,让go函数被return出来了,下一步操作,go函数是单独被调用,他的调用已经和factory函数无关了,这时候他却依旧可以使用origin这个参数,原因就是闭包。因为语言本身设置了闭包这个概念,所以他可以使用原先赋值给origin,但是实际上是factory函数的局部变量的函数,所以有了return他是一个闭包。但是呢,如果是直接使用,而factory函数没有做return的时候,factroy里origin的形参,pos的实参,对于go函数来说就是一个全局变量,最少来说他的作用域范围是笼罩了go函数本身的,如果是笼罩了,那就不需要闭包这个特性,而是使用的函数变量作用域范围这个特性,就没有使用闭包特性,所以return之后,在外面调用,他就是闭包,如果不return,外部调用不了,那闭包也实现不了,这是我的对于你这个问题的理解,当然也可能是错的,因为我的假设前提是我自己的理解
2019-02-27
共6条回复

Python3.8系统入门+进阶 (程序员必备第二语言)

语法精讲/配套练习+思考题/原生爬虫实战

14446 学习 · 4438 问题

查看课程