鱼C论坛

 找回密码
 立即注册
查看: 1347|回复: 13

[已解决]python零基础课后题的疑问

[复制链接]
发表于 2017-3-3 22:29:25 | 显示全部楼层 |阅读模式

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

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

x
1.var = ' Hi '  
2.def fun1():  
3.    global var  
4.    var = ' How '  
5.    return fun2(var)  
6.def fun2(var):  
7.    var += 'are you'  
8.    fun3(var)  
9.    return var  
10.def fun3(var):  
11.    var = ' yes '  
12.print(fun1())  

运行结果是:   How are you

fun1最终返回的是fun2的运算结果,也就是说在fun2中返回的var == How are you,为什么在fun2中通过var += ‘are you’修改了var,而之后调用fun3没有修改var?三个函数中的var是什么关系?

———————————————————————————————————————


1.def funOut():  
2.    def funIn():  
3.        print('宾果!你成功访问到我啦!')  
4.    return funIn()  
  
访问funIn() 需要采用funOut(),而在

1.def funOut():  
2.    def funIn():  
3.        print('宾果!你成功访问到我啦!')  
4.    return funIn  

中访问funIn()需要采用funOut()()。代码里面的 return funIn()和return funIn有什么区别?


——————————————————————————————————————————————







1.def funX():  
2.    x = 5  
3.    def funY():  
4.        nonlocal x  
5.        x += 1  
6.        return x  
7.    return funY  
8.a = funX()  
9.print(a())  
10.print(a())  
11.print(a()) 

最后打印的结果是:6
                  7
                  8

答案是这么解释的:当a = funX()的时候,只要a变量没有被重新赋值,funX()就没有被释放,也就是说局部变量x就没有被重新初始化。

funX没有被释放是什么意思?是因为x非局部变量,所以每次的x也会依次变化,重新用于下一次的计算?


代码A
1.def outside():  
2.    var = 5  
3.    def inside():  
4.        var = 3  
5.        print(var)  
6.          
7.    inside()  
8.outside()  

代码B
[code]1.def outside():  
2.    var = 5  
3.    def inside():  
4.        print(var)  
5.        var = 3  
6.          
7.    inside()  
8.outside() 


代码B会报错:这里outside()函数里有一个var变量,内嵌函数inside()也有一个同名的变量,Python为了保护变量的作用域,故将outside()的var变量屏蔽起来,因此此时是无法访问到外层的var变量的。

为啥print的时候不能把外层的var=5传进来?Python是发现了print(var)里面的var才屏蔽外层变量var的吗?因为后面才是对var赋值,所以前面print的时候,闭包里面的var没值?
最佳答案
1970-1-1 08:00:00
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-3-4 08:22:29 | 显示全部楼层
第一个fun2返回的是var,不是fun3.fun1的 global可以修改
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-4 08:23:30 | 显示全部楼层
第二个就是()的区别。所以调用的时候,没()的需要加上,有()的直接就调用了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-4 08:26:40 | 显示全部楼层
撸主再看一遍视频吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-4 10:02:43 | 显示全部楼层
因为你第三个函数没有返回var,而你第二个函数却返回了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-4 15:23:58 | 显示全部楼层
第一个fun2返回的是var,不是fun3.fun1的 global可以修改
第二个就是()的区别。所以调用的时候,没()的需要加上,有()的直接就调用了
第一种,每次执行print(a())实际效果是调用一次funX()并打印返回值,因此是累加1的。
第二种,只运行了一次funX()并赋值给了a,print的始终是a的值。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-4 17:45:10 | 显示全部楼层
python的变量本身是一种动态语言,定义变量时没有具体的数据类型,所以它的变量是可以反复赋值的。fun3没有返回值,所以即使调用fun3也只是返回了一个none而已,并不会改变fun2中的var值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-4 21:46:56 | 显示全部楼层
xxpythonxx 发表于 2017-3-4 08:22
第一个fun2返回的是var,不是fun3.fun1的 global可以修改

谢谢您的回复。您看我解释的对吗?
调用fun1 ->由于var为global -> var 变为 How -> 返回(调用)fun2 -> var 变为 How are you -> 调用fun3
-> var 变为 yes(但由于fun3没有返回任何值(NONE),并没有对结果产生变化)-> return var ->How are you.

我还有一个补充问题想请教您,fun1 中的 global var 的作用范围有多大呢?只在fun1中好用还是fun2,fun3中都好用呢?谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-4 22:00:43 | 显示全部楼层
32269100 发表于 2017-3-4 09:22
关于你第二个问题,我给一个链接你看吧,是我之前回答过的了。
http://bbs.fishc.com/thread-83216-1-1. ...

谢谢您的回复,您的解释很明白,对我很有帮助。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-4 22:01:18 | 显示全部楼层
^ambition 发表于 2017-3-4 10:02
因为你第三个函数没有返回var,而你第二个函数却返回了

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

使用道具 举报

 楼主| 发表于 2017-3-4 22:04:25 | 显示全部楼层
xxpythonxx 发表于 2017-3-4 08:22
第一个fun2返回的是var,不是fun3.fun1的 global可以修改

我的帖子最后一个问题能再请您帮我解答一下吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-4 22:05:00 | 显示全部楼层
新手·ing 发表于 2017-3-4 15:23
第一个fun2返回的是var,不是fun3.fun1的 global可以修改
第二个就是()的区别。所以调用的时候,没()的需 ...

谢谢您
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-4 22:05:59 | 显示全部楼层
五行缺五行 发表于 2017-3-4 17:45
python的变量本身是一种动态语言,定义变量时没有具体的数据类型,所以它的变量是可以反复赋值的。fun3没有 ...

谢谢,您的解释让我明白了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-5 09:25:02 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 20:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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