小白求助py[课后作业] 第019讲
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又没法改变了呢?这里是因为被屏蔽了吗? 我写了个很详细的回答,图片蛮多,我用的是Thoony调试给你的结果,你看了就明白了了。如果还不懂再问我吧。static/image/hrline/line7.pnghttps://fishc.com.cn/static/image/hrline/line7.pnghttps://fishc.com.cn/static/image/hrline/line7.pnghttps://fishc.com.cn/static/image/hrline/line7.pnghttps://fishc.com.cn/static/image/hrline/line7.pnghttps://fishc.com.cn/static/image/hrline/line7.pnghttps://fishc.com.cn/static/image/hrline/line7.pnghttps://fishc.com.cn/static/image/hrline/line7.pnghttps://fishc.com.cn/static/image/hrline/line7.pnghttps://fishc.com.cn/static/image/hrline/line7.pnghttps://fishc.com.cn/static/image/hrline/line7.pnghttps://fishc.com.cn/static/image/hrline/line7.png
调试程序,运行fun1();首先var在外部是全局变量,所以此时var= ‘HI’
先进入的是fun1();进入之后var被声明为全局,因此,此时可以从fun1的内部修改var的值了,
当这一步运行完之后就发现var修改为’Baby’。
运行完上一步后,到这一步就可以发现,右侧可见,var已经修改了
然后再运行return fun2(var),很明显是要搞清楚这个fun2(var)运行后的返回值了,此时return fun2(var)中的带进去的参数为’Baby’
带着这个’Baby’的参数进去到fun2之后,可见右侧的var在全局中还是’Baby’。此时,对fun2中的var进行运算,
很显然,var运算的结果是var变为Baby I love you。于是,带着Baby I love you这参数,我们将其带入到了fun3中。当然必须说明的是,fun2的返回值是返回此时在fun2的局部变量var——也即为BabyI love you。好了,到这里基本就不用再看fun3了,因为在fun3中也没有对var当成全局变量的声明,更没有修改
但是为了看的更清楚,我继续说一下fun3。进去fun3之后,此时带入fun3的参数还是var=BabyI love you。然后运行fun3的第一句,可以发现在fun3中的局部变量也是var,此时var就成了' 小甲鱼 '。但是注意这个函数没有返回值哦!!返回值是None。
我们甚至还可以看到在右侧提示全局变量var还是Baby哦!!
于是再回到fun2中的第三句,返回值为None,什么也不做
之后运行return var,当然此时的var已经是Baby I love you。
因此fun1中的returnfun2(var)自然就是返回的就是fun2的返回值——Baby I love you。那么,fun1返回的也是这个字符串Baby I love you。
fun2里面并没有修改val,它的函数返回值作为了fun1的函数返回值,打印fun1的函数返回值,追踪到代码就是fun2(var),所以返回值也就是此时var输入下的fun2函数的返回值。 两个问题同个解答:只要函数里面没有定义和全局变量同样名字的变量,那么默认是全局变量,否则变局部,比如:name = "小白"
def A():
print(name) # 默认全局变量
def B(name): # 只取变量 name 的值
print(name) # 默认全局变量
def C():
name = "小黑" # 局部变量
print(name) # 局部变量
def D(name): # 只取变量 name 的值
name = "小黑" # 局部变量
print(name) # 局部变量
def E():
global name # 定义 name 为全局(意思就是不管怎样,只要在这函数里面动用 name 变量,就一定是全局变量,全局变量的值也会改变)
name = "小蓝" # 全局变量
print(name) # 全局变量
A() # 没有影响全局变量的值
B(name) # 没有影响全局变量的值
C() # 没有影响全局变量的值
D(name) # 没有影响全局变量的值
print(name) # 没有影响全局变量的值
E() # 改变全局变量的值
print(name) # 函数 E 已经影响全局变量的值小白
小白
小黑
小黑
小白
小蓝
小蓝 {:5_106:} {:5_106:} Python初学者8号 发表于 2021-10-20 17:40
我写了个很详细的回答,图片蛮多,我用的是Thoony调试给你的结果,你看了就明白了了。如果还不懂再问我吧。 ...
解答得特别的详细,灰常感谢{:10_287:}。我还想问问为什么fun2()里面的var前面可以不用加global,就比如
def fun2(var):
global var += 'I love you'
fun3(var)
return var
傻眼貓咪 发表于 2021-10-20 18:06
两个问题同个解答:只要函数里面没有定义和全局变量同样名字的变量,那么默认是全局变量,否则变局部,比如 ...
这部分我懂了,感谢{:10_287:} 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)
梦回连营 发表于 2021-10-20 18:00
fun2里面并没有修改val,它的函数返回值作为了fun1的函数返回值,打印fun1的函数返回值,追踪到代码就是fun ...
好像懂了点,还是感谢{:10_287:} 祢豆子oo 发表于 2021-10-22 19:53
想再问下 var = ' Hi '
def fun1():
global var
抱歉看到的比较晚哈,相信你也应该懂了,如果在fun3里面加上了return var,那么很显然这里的var是你fun3中的定义的局部变量的var = '小甲鱼'。
此时的话,在fun2的这句话中,这个fun3(var)的调用等同于你这这写了一句‘小甲鱼’——你看这个没有赋值吧?没有赋值那就对在fun2中的var没有影响,自然,对于结果没有影响了{:10_254:} Python初学者8号 发表于 2021-10-23 10:56
抱歉看到的比较晚哈,相信你也应该懂了,如果在fun3里面加上了return var,那么很显然这里的var是你fun3 ...
哈哈没事没事周末嘛,我昨天也出去玩了才看到回复。这部分我懂了,谢谢大佬的回复,3Q。 祢豆子oo 发表于 2021-10-24 19:31
哈哈没事没事周末嘛,我昨天也出去玩了才看到回复。这部分我懂了,谢谢大佬的回复,3Q。
不客气,嘿嘿,那个thonny很好用的,你可以试试,调试的功能真的很多时候让你对分析的问题一目了然,你可以下载者用下,很轻量级,值得推荐 Python初学者8号 发表于 2021-10-25 13:02
不客气,嘿嘿,那个thonny很好用的,你可以试试,调试的功能真的很多时候让你对分析的问题一目了然,你可 ...
好的,我去下一个谢谢推荐 学习学习
页:
[1]