鱼C论坛

 找回密码
 立即注册
查看: 2835|回复: 14

[已解决]小白求助py[课后作业] 第019讲

[复制链接]
发表于 2021-10-20 17:40:12 | 显示全部楼层 |阅读模式
30鱼币
4. 目测以下程序会打印什么内容
var = ' Hi '

def fun1():
    global var
    var = ' Baby '
    return fun2(var)

def fun2(var):
    var += 'I love you'
    fun3(var)
    return var

def fun3(var):
    var = ' 小甲鱼 '

print(fun1())
              
会打印: Baby I love you

问题一: fun2里面的var并没有用global,为什么能对var进行改变?
问题二:既然fun2里面对var进行改变了,为什么fun3又没法改变了呢?这里是因为被屏蔽了吗?
最佳答案
2021-10-20 17:40:13
我写了个很详细的回答,图片蛮多,我用的是Thoony调试给你的结果,你看了就明白了了。如果还不懂再问我吧。

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图


调试程序,运行fun1();
首先var在外部是全局变量,所以此时var= ‘HI’

1.png

先进入的是fun1();进入之后var被声明为全局,因此,此时可以从fun1的内部修改var的值了,
2.png

当这一步运行完之后就发现var修改为’Baby’。
3.png

运行完上一步后,到这一步就可以发现,右侧可见,var已经修改了
4.png

然后再运行return fun2(var),很明显是要搞清楚这个fun2(var)运行后的返回值了,此时return fun2(var)中的带进去的参数为’Baby’
5.png

带着这个’Baby’的参数进去到fun2之后,可见右侧的var在全局中还是’Baby’。此时,对fun2中的var进行运算,
6.png

很显然,var运算的结果是var变为Baby I love you。于是,带着Baby I love you这参数,我们将其带入到了fun3中。当然必须说明的是,fun2的返回值是返回此时在fun2的局部变量var——也即为BabyI love you。好了,到这里基本就不用再看fun3了,因为在fun3中也没有对var当成全局变量的声明,更没有修改
7.png

但是为了看的更清楚,我继续说一下fun3。进去fun3之后,此时带入fun3的参数还是var=BabyI love you。然后运行fun3的第一句,可以发现在fun3中的局部变量也是var,此时var就成了' 小甲鱼 '。但是注意这个函数没有返回值哦!!返回值是None。 8.png

我们甚至还可以看到在右侧提示全局变量var还是Baby哦!!
9.png

于是再回到fun2中的第三句,返回值为None,什么也不做
10.png

之后运行return var,当然此时的var已经是Baby I love you
11.png

因此fun1中的returnfun2(var)自然就是返回的就是fun2的返回值——Baby I love you。那么,fun1返回的也是这个字符串Baby I love you
12.png







最佳答案

查看完整内容

我写了个很详细的回答,图片蛮多,我用的是Thoony调试给你的结果,你看了就明白了了。如果还不懂再问我吧。 调试程序,运行fun1();首先var在外部是全局变量,所以此时var= ‘HI’ 先进入的是fun1();进入之后var被声明为全局,因此,此时可以从fun1的内部修改var的值了, 当这一步运行完之后就发现var修改为’Baby’。 运行完上一步后,到这一步就可以发现,右侧可见,var已经修改了 然后再运行return fun2(var), ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-10-20 17:40:13 | 显示全部楼层    本楼为最佳答案   
我写了个很详细的回答,图片蛮多,我用的是Thoony调试给你的结果,你看了就明白了了。如果还不懂再问我吧。

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图


调试程序,运行fun1();
首先var在外部是全局变量,所以此时var= ‘HI’

1.png

先进入的是fun1();进入之后var被声明为全局,因此,此时可以从fun1的内部修改var的值了,
2.png

当这一步运行完之后就发现var修改为’Baby’。
3.png

运行完上一步后,到这一步就可以发现,右侧可见,var已经修改了
4.png

然后再运行return fun2(var),很明显是要搞清楚这个fun2(var)运行后的返回值了,此时return fun2(var)中的带进去的参数为’Baby’
5.png

带着这个’Baby’的参数进去到fun2之后,可见右侧的var在全局中还是’Baby’。此时,对fun2中的var进行运算,
6.png

很显然,var运算的结果是var变为Baby I love you。于是,带着Baby I love you这参数,我们将其带入到了fun3中。当然必须说明的是,fun2的返回值是返回此时在fun2的局部变量var——也即为BabyI love you。好了,到这里基本就不用再看fun3了,因为在fun3中也没有对var当成全局变量的声明,更没有修改
7.png

但是为了看的更清楚,我继续说一下fun3。进去fun3之后,此时带入fun3的参数还是var=BabyI love you。然后运行fun3的第一句,可以发现在fun3中的局部变量也是var,此时var就成了' 小甲鱼 '。但是注意这个函数没有返回值哦!!返回值是None。 8.png

我们甚至还可以看到在右侧提示全局变量var还是Baby哦!!
9.png

于是再回到fun2中的第三句,返回值为None,什么也不做
10.png

之后运行return var,当然此时的var已经是Baby I love you
11.png

因此fun1中的returnfun2(var)自然就是返回的就是fun2的返回值——Baby I love you。那么,fun1返回的也是这个字符串Baby I love you
12.png







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

使用道具 举报

发表于 2021-10-20 18:00:18 | 显示全部楼层
fun2里面并没有修改val,它的函数返回值作为了fun1的函数返回值,打印fun1的函数返回值,追踪到代码就是fun2(var),所以返回值也就是此时var输入下的fun2函数的返回值。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-10-20 18:06:21 | 显示全部楼层
两个问题同个解答:只要函数里面没有定义和全局变量同样名字的变量,那么默认是全局变量,否则变局部,比如:
  1. name = "小白"

  2. def A():
  3.     print(name)   # 默认全局变量

  4. def B(name):      # 只取变量 name 的值
  5.     print(name)   # 默认全局变量

  6. def C():
  7.     name = "小黑" # 局部变量
  8.     print(name)   # 局部变量

  9. def D(name):      # 只取变量 name 的值
  10.     name = "小黑" # 局部变量
  11.     print(name)   # 局部变量

  12. def E():
  13.     global name # 定义 name 为全局(意思就是不管怎样,只要在这函数里面动用 name 变量,就一定是全局变量,全局变量的值也会改变)
  14.     name = "小蓝" # 全局变量
  15.     print(name) # 全局变量

  16. A()         # 没有影响全局变量的值
  17. B(name)     # 没有影响全局变量的值
  18. C()         # 没有影响全局变量的值
  19. D(name)     # 没有影响全局变量的值
  20. print(name) # 没有影响全局变量的值
  21. E()         # 改变全局变量的值
  22. print(name) # 函数 E 已经影响全局变量的值
复制代码
  1. 小白
  2. 小白
  3. 小黑
  4. 小黑
  5. 小白
  6. 小蓝
  7. 小蓝
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-10-20 18:06:59 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-10-21 08:03:52 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-10-22 19:23:07 | 显示全部楼层
Python初学者8号 发表于 2021-10-20 17:40
我写了个很详细的回答,图片蛮多,我用的是Thoony调试给你的结果,你看了就明白了了。如果还不懂再问我吧。 ...

解答得特别的详细,灰常感谢。我还想问问为什么fun2()里面的var前面可以不用加global,就比如
def fun2(var):
     global var += 'I love you'
     fun3(var)   
     return var
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-10-22 19:23:59 | 显示全部楼层
傻眼貓咪 发表于 2021-10-20 18:06
两个问题同个解答:只要函数里面没有定义和全局变量同样名字的变量,那么默认是全局变量,否则变局部,比如 ...

这部分我懂了,感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-10-22 19:53:43 | 显示全部楼层
Python初学者8号 发表于 2021-10-20 17:40
我写了个很详细的回答,图片蛮多,我用的是Thoony调试给你的结果,你看了就明白了了。如果还不懂再问我吧。 ...

想再问下 var = ' Hi '
def fun1():
    global var
    var = ' Baby '
    return fun2(var)
def fun2(var):
    var += 'I love you'
    fun3(var)  # 如果fun3()里面如下加上了retrun,那这里返回的是什么呢?
    return var
def fun3(var):
    var = ' 小甲鱼 '
    return var
print(fun1())
print(var)
print(fun3(var)) # 这里为什么不是输出Baby呢?
print(var)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-10-22 19:54:29 | 显示全部楼层
梦回连营 发表于 2021-10-20 18:00
fun2里面并没有修改val,它的函数返回值作为了fun1的函数返回值,打印fun1的函数返回值,追踪到代码就是fun ...

好像懂了点,还是感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-10-23 10:56:14 | 显示全部楼层
祢豆子oo 发表于 2021-10-22 19:53
想再问下 var = ' Hi '
def fun1():
    global var

抱歉看到的比较晚哈,相信你也应该懂了,如果在fun3里面加上了return var,那么很显然这里的var是你fun3中的定义的局部变量的var = '小甲鱼'。
此时的话,在fun2的这句话中,这个fun3(var)的调用等同于你这这写了一句‘小甲鱼’——你看这个没有赋值吧?没有赋值那就对在fun2中的var没有影响,自然,对于结果没有影响了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-10-24 19:31:34 | 显示全部楼层
Python初学者8号 发表于 2021-10-23 10:56
抱歉看到的比较晚哈,相信你也应该懂了,如果在fun3里面加上了return var,那么很显然这里的var是你fun3 ...

哈哈没事没事周末嘛,我昨天也出去玩了才看到回复。这部分我懂了,谢谢大佬的回复,3Q。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-10-25 13:02:08 | 显示全部楼层
祢豆子oo 发表于 2021-10-24 19:31
哈哈没事没事周末嘛,我昨天也出去玩了才看到回复。这部分我懂了,谢谢大佬的回复,3Q。

不客气,嘿嘿,那个thonny很好用的,你可以试试,调试的功能真的很多时候让你对分析的问题一目了然,你可以下载者用下,很轻量级,值得推荐
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-10-31 11:04:50 | 显示全部楼层
Python初学者8号 发表于 2021-10-25 13:02
不客气,嘿嘿,那个thonny很好用的,你可以试试,调试的功能真的很多时候让你对分析的问题一目了然,你可 ...

好的,我去下一个谢谢推荐
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-10-31 14:39:50 From FishC Mobile | 显示全部楼层
学习学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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