鱼C论坛

 找回密码
 立即注册
查看: 1430|回复: 7

[已解决]《020函数:内嵌函数和闭包》上课中的一些问题

[复制链接]
发表于 2017-11-23 21:42:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1.小甲鱼老师在讲在函数中对局部变量进行修改不会影响全局变量这个知识点时,我认为应该是在定义的MyFun()中print(count)而不是print(10),请问是不是老师打错了?(如图1,这是老师上课时编写的代码)
2.老师在讲“闭包”时,FunY可直接返回,而不用带()(如图2),为什么在讲“内部函数只能对外部函数的局部变量进行访问而无法进行修改”时,一定要return Fun2()呢?明明return Fun2没出问题,显示和刚才return FunY一样呀?(如图3)
最佳答案
2017-11-24 08:58:54
jle55555 发表于 2017-11-23 22:43
哇,大佬好!但还是有点问题:第一,从图1可以看出,其实在函数中修改全局变量虽然不会成功,但也不会报 ...

图一中的情况并不是使用了外部函数的局部变量,而是自定义了一个同名的变量count,所以随意修改都不会报错

图三中报错的原因是这条语句中 x *= x 的右边的x并未被定义,或者声明为nonlocal

图1

图1

图2

图2

图3

图3
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-11-23 22:02:29 | 显示全部楼层
1 你的理解是对的,应该是count

2 图片3中的两种写法都是错误的,因为内部函数都修改了外部函数的局部变量的值

你可能表示怀疑,第一种写法并没报错,那么你这样调用试试:Fun1()(),肯定也会报错。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-23 22:43:24 | 显示全部楼层
BngThea 发表于 2017-11-23 22:02
1 你的理解是对的,应该是count

2 图片3中的两种写法都是错误的,因为内部函数都修改了外部函数的局部变 ...

哇,大佬好!但还是有点问题:第一,从图1可以看出,其实在函数中修改全局变量虽然不会成功,但也不会报错;但从图3可以看出,内部函数修改外部函数的局部变量的值,会直接报错,并提示外部函数的局部变量未定义前引用(local variable 'x' referenced before assignment),所以小甲鱼在课程中提到的“全局变量之于局部变量”相当于“非全局变量的外部变量之于内部函数的局部变量”是不完全正确的?因为前者更改不会报错,而后者会报错?第二,图3的报错显示的是“local variable 'x' referenced before assignment”,但外部变量不是可以被内部函数访问吗?为什么未定义呢?我觉得应该提示不能修改外部变量才对呀?
新手语言组织可能不好,希望大佬见谅,再次感谢大佬回答问题!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-24 08:58:54 | 显示全部楼层    本楼为最佳答案   
jle55555 发表于 2017-11-23 22:43
哇,大佬好!但还是有点问题:第一,从图1可以看出,其实在函数中修改全局变量虽然不会成功,但也不会报 ...

图一中的情况并不是使用了外部函数的局部变量,而是自定义了一个同名的变量count,所以随意修改都不会报错

图三中报错的原因是这条语句中 x *= x 的右边的x并未被定义,或者声明为nonlocal
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-24 10:20:25 | 显示全部楼层
BngThea 发表于 2017-11-24 08:58
图一中的情况并不是使用了外部函数的局部变量,而是自定义了一个同名的变量count,所以随意修改都不会报 ...

好的好的,十分谢谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-24 11:25:13 | 显示全部楼层
BngThea 发表于 2017-11-24 08:58
图一中的情况并不是使用了外部函数的局部变量,而是自定义了一个同名的变量count,所以随意修改都不会报 ...

大佬,我可不可这么理解:
图1只有一个函数,没有内部函数。所以在函数中对全局变量进行修改,会生成一个同名的局部变量,无论怎么修改都不会出错。
而图3中有外部函数和内部函数,如果在内部函数中试图对外部函数的局部变量(外部变量)进行修改,并不会在内部函数中生成一个同名的局部变量,反而会屏蔽外部函数的局部变量,导致出现变量未定义的报错。
所以“外部函数的局部变量之于内部函数的局部变量相当于全局变量之于局部变量的关系”这句话实际上不准确,因为前者修改外部变量时不会生成同名变量,会直接报错,而后者修改全局变量时,会生成同名变量不报错?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-24 11:40:21 | 显示全部楼层
jle55555 发表于 2017-11-24 11:25
大佬,我可不可这么理解:
图1只有一个函数,没有内部函数。所以在函数中对全局变量进行修改,会生成一 ...

大佬不敢当,一起交流,共同进步

“图1只有一个函数,没有内部函数。所以在函数中对全局变量进行修改,会生成一个同名的局部变量,无论怎么修改都不会出错。”
这句话没错,但是不全面:不管有没有内部函数,只要你在某个函数内部对一个变量用已知的对象进行重新赋值,比如count=10就是将常量10赋值给了count,那么这个变量count就会屏蔽函数外的所有同名变量

“而图3中有外部函数和内部函数,如果在内部函数中试图对外部函数的局部变量(外部变量)进行修改,并不会在内部函数中生成一个同名的局部变量,反而会屏蔽外部函数的局部变量,导致出现变量未定义的报错。”
这句话的理解不准确,因为图3中内部函数并没有对x进行声明(应该声明为 nonlocal x),如果有了这个声明,那么就不会报错了。之所以报错,并不是它修改了外部函数的变量x,而是他根本就不知道x是什么,就好象你单独写一句
x *= x
那么肯定报错,因为没有对x进行赋值,无法进行计算
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-24 15:29:40 | 显示全部楼层
BngThea 发表于 2017-11-24 11:40
大佬不敢当,一起交流,共同进步

“图1只有一个函数,没有内部函数。所以在函数中对全局变量进行修改 ...


好的,我自己再理解下,谢谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-2 22:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表