鱼C论坛

 找回密码
 立即注册
查看: 1522|回复: 16

[已解决]python的全局变量和局部变量——小甲鱼零基础学python19讲,作业第四题

[复制链接]
发表于 2019-1-20 16:29:03 | 显示全部楼层 |阅读模式
8鱼币
4. 目测以下程序会打印什么内容?
1.        var = ' Hi '
2.       
3.        def fun1():
4.            global var
5.            var = ' Baby '
6.            return fun2(var)
7.       
8.        def fun2(var):
9.            var += 'I love you'
10.            fun3(var)
11.            return var
12.       
13.        def fun3(var):
14.            var = ' 小甲鱼 '
15.       
16.        print(fun1())
17.       
复制代码

请问这道题读出Baby I love you 的逻辑,是怎么走的,着重说从局部变量和全局变量的角度解释。谢谢!
最佳答案
2019-1-20 16:29:04
首先,程序定义var='Hi';然后声明了三个函数,先跳过去一会儿调用的时候再说。
最后一句代码,print(fun1())调用了fun1(),此时传递过去的var='Hi';
进入fun1()函数,在此函数中,声明了var为global变量,即此函数中的car就是全局变量var,然后在fun1()函数中修改var变量的值为'Baby',在return语句中调用了fun2()函数,传递的参数var='Baby';
进入fun2()函数中,对var进行了修改,因此会创建一个局部变量var='Baby',然后执行var += 'I love you'语句后,fun2()的局部变量var='Baby I Love you',注意:此时全局变量var仍然是'Baby',执行下一句程序,调用fun3()函数,传递的参数是fun2()函数的局部变量var='Baby I Love you';
进入fun3()函数,对var进行了修改,因此会创建一个局部变量var='Baby I Love you',然后执行var='小甲鱼',fun3()函数执行完毕;
返回到fun2()函数,在fan2()函数中,局部变量var='Baby I Love you',执行最后一句return var;
返回到fun1()函数,fun1()函数接收到fun2()函数的返回值'Baby I Love you',并将该值直接return返回;
返回主程序print('Baby I Love you')。

一共有三个变量var:全局变量var,首先赋值'Hi',然后在fun1()函数中修改为'Baby';fun2()函数的局部变量var,调用函数时传递过来的值为'Baby',然后修改为'Baby I Love you';fun3()函数的局部变量var,调用函数时传递过来的值为'Baby I Love you',然后修改为了'小甲鱼'。

最佳答案

查看完整内容

首先,程序定义var='Hi';然后声明了三个函数,先跳过去一会儿调用的时候再说。 最后一句代码,print(fun1())调用了fun1(),此时传递过去的var='Hi'; 进入fun1()函数,在此函数中,声明了var为global变量,即此函数中的car就是全局变量var,然后在fun1()函数中修改var变量的值为'Baby',在return语句中调用了fun2()函数,传递的参数var='Baby'; 进入fun2()函数中,对var进行了修改,因此会创建一个局部变量var='Baby',然后执行 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-1-20 16:29:04 | 显示全部楼层    本楼为最佳答案   
首先,程序定义var='Hi';然后声明了三个函数,先跳过去一会儿调用的时候再说。
最后一句代码,print(fun1())调用了fun1(),此时传递过去的var='Hi';
进入fun1()函数,在此函数中,声明了var为global变量,即此函数中的car就是全局变量var,然后在fun1()函数中修改var变量的值为'Baby',在return语句中调用了fun2()函数,传递的参数var='Baby';
进入fun2()函数中,对var进行了修改,因此会创建一个局部变量var='Baby',然后执行var += 'I love you'语句后,fun2()的局部变量var='Baby I Love you',注意:此时全局变量var仍然是'Baby',执行下一句程序,调用fun3()函数,传递的参数是fun2()函数的局部变量var='Baby I Love you';
进入fun3()函数,对var进行了修改,因此会创建一个局部变量var='Baby I Love you',然后执行var='小甲鱼',fun3()函数执行完毕;
返回到fun2()函数,在fan2()函数中,局部变量var='Baby I Love you',执行最后一句return var;
返回到fun1()函数,fun1()函数接收到fun2()函数的返回值'Baby I Love you',并将该值直接return返回;
返回主程序print('Baby I Love you')。

一共有三个变量var:全局变量var,首先赋值'Hi',然后在fun1()函数中修改为'Baby';fun2()函数的局部变量var,调用函数时传递过来的值为'Baby',然后修改为'Baby I Love you';fun3()函数的局部变量var,调用函数时传递过来的值为'Baby I Love you',然后修改为了'小甲鱼'。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-1-20 17:50:00 | 显示全部楼层
首先  全局变量VAR  被内部 global  var重新定义为  baby  其次  重新为 VAR  添加 I LOVE YOU  保存在FUN2中(var += "i love you")    这时 return var 返回的 var内容是 baby i love  you
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-1-20 20:08:31 | 显示全部楼层
发表的时候,上面表情左边这样的<>可以插入代码
  1. var = ' Hi '

  2. def fun1():  #程序从这里开机
  3.     global var  #声明这是全局变量
  4.     var = ' Baby '  #对全变量进行重新赋值为Baby
  5.     return fun2(var)  #这里调用函数fun2

  6. def fun2(var):  #再到这里
  7.     var += 'I love you' #进行修改:Baby I love you,注这里不是全局变量,是和全局变量名字一样的局部变量
  8.     fun3(var)   #调用fun3,注意这里是单纯的调用,假如你修改为var=fun3(var),那么最终的值会变成小甲鱼
  9.     return var  #返回var

  10. def fun3(var): #fun3没有返回值
  11.     var = ' 小甲鱼 '
  12.     return var

  13. print(fun1())
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-1-20 20:21:46 | 显示全部楼层
global x。可以把局部变量变成全局变量
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-1-20 23:12:52 | 显示全部楼层
本帖最后由 jackz007 于 2019-1-21 00:49 编辑

        局部和全局变量的区别很简单,在不同函数中的同一个变量,只有专门用 global 关键字声明过的才是全局变量,否则就是局部变量。

        在本例中,如果要对号入座的话,fun1()、fun2()、fun3() 三个函数都有变量 var,但是,只有 fun1() 中的是全局变量,其他的都是局部变量。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-1-21 00:41:14 | 显示全部楼层
sunrise085 发表于 2019-1-20 23:10
首先,程序定义var='Hi';然后声明了三个函数,先跳过去一会儿调用的时候再说。
最后一句代码,print(fun1 ...

不累吗。兄弟~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-1-21 14:25:44 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-1-21 14:58:46 | 显示全部楼层
Stubborn 发表于 2019-1-20 20:08
发表的时候,上面表情左边这样的可以插入代码

每次看你这个头像都忍不住想问番号  私聊一波?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-1-21 15:10:42 | 显示全部楼层
Y0uWill_1Will 发表于 2019-1-21 14:58
每次看你这个头像都忍不住想问番号  私聊一波?

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

使用道具 举报

发表于 2019-1-21 15:17:47 | 显示全部楼层
Stubborn 发表于 2019-1-20 20:08
发表的时候,上面表情左边这样的可以插入代码
  1. def fun2(var):
  2.      var += ‘I love you’
  3.      fun3(var) #如果输出‘小甲鱼’,那么就需要var = fun3(var)再加上fun3中的return var,原题中fun3没有return,如果只是加上var = fun3(over),那么输出'None'
  4.      return var
复制代码


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

使用道具 举报

发表于 2019-1-21 15:29:07 | 显示全部楼层
1.从作用域的角度出发,变量可以分为三层:
第一层为全局变量,作用域为整个module;
第二层为局部变量,作用域一般为函数内部;
第三层是非局部变量(通过nonlocal实现),作用域一般为子函数内部
从上往下,作用域逐渐减少

2.在函数调用中,如果要对全局变量进行重新赋值,就要在函数中global x然后接着给x赋值(从第二层升为第一层,华丽升级);
而对于函数中有子函数的情形,需要在子函数中对局部变量进行重新赋值,那么就在子函数进行nonlocal x然后赋值(从第二层变为第三层,降级)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-1-23 09:55:37 | 显示全部楼层
Y0uWill_1Will 发表于 2019-1-21 14:58
每次看你这个头像都忍不住想问番号  私聊一波?

我有,你要吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-1-23 11:03:11 | 显示全部楼层

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

使用道具 举报

发表于 2019-1-23 23:06:41 | 显示全部楼层

直接公布答案就好了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-1-24 11:49:59 | 显示全部楼层
Stubborn 发表于 2019-1-20 20:08
发表的时候,上面表情左边这样的可以插入代码

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

使用道具 举报

 楼主| 发表于 2019-1-24 11:51:23 | 显示全部楼层
sunrise085 发表于 2019-1-20 16:29
首先,程序定义var='Hi';然后声明了三个函数,先跳过去一会儿调用的时候再说。
最后一句代码,print(fun1 ...

打字辛苦了。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-26 12:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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