tt000 发表于 2021-7-3 08:36:58

为什么打印Baby I love you而不是打印小甲鱼

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

qiuyouzhi 发表于 2021-7-3 09:34:47

fun3 里的 var 是个局部变量,且没有返回它
不会影响 fun2 里的 var 的值

sunrise085 发表于 2021-7-3 09:45:44

写了注释,你看一下。这是变量作用域的问题。局部变量和全局变量其实是不同的变量,你可以用print(id(var))看一下就知道了,可以分别在三个函数和主程序中输出var的id就可以看出来了。
var = ' Hi '            #全局变量var,称之为var0,变量var0=' Hi '

def fun1():
    global var          #全局变量var0,变量var0=' Hi '
    var = ' Baby '      #全局变量var0,变量var0=' Baby '
    return fun2(var)    #全局变量var0,实参var0=' Baby '。得到的返回值在第11行

def fun2(var):          #局部变量var,称之为var1,变量var1=' Baby '
    var += 'I love you' #局部变量var1=' Baby I love you'
    fun3(var)         #局部变量var1,实参var1=' Baby I love you'。fun3()不影响var1的值
    return var          #将var1作为返回值,var1=' Baby I love you'。fun2()的返回值不影响var0的值

def fun3(var):          #局部变量var,称之为var2,变量var2=' Baby I love you'
    var = ' 小甲鱼 '    #局部变量var2=' 小甲鱼 '

print(fun1())         #该语句打印的是fun1()的返回值,即第6行的return内容,也即第11行的返回值' Baby I love you'
print(var)            #全局变量var0=' Baby '

深谙流年 发表于 2021-7-3 09:48:43

因为你第二个函数属于调用,所以不能使用global

heidern0612 发表于 2021-7-3 10:13:02

1、fun1声明了全局,所以fun1里的var值覆盖了全局变量,var变成了Baby,此时return的值为fun2的值。

2、fun2调用的var为Baby,下面连接了个字符串,变成了Baby,I Love You,返回。

3、局部变量不影响全局变量,所以fun3的局部调用不影响全局,不用考虑fun3的调用了。

深谙流年 发表于 2021-7-3 10:30:33

sunrise085 发表于 2021-7-3 09:45
写了注释,你看一下。这是变量作用域的问题。局部变量和全局变量其实是不同的变量,你可以用print(id(var)) ...

我觉得吧,调用函数就相当于新开一个函数,所有的定义都是初始化的,返回函数的话是可以把之前的函数做的改变一起拿到下个函数的,不知道这样理解行不行

特利迦奥特曼 发表于 2021-7-3 14:19:43

fun3 里的 var 是个局部变量,且没有返回它
不会影响 fun2 里的 var 的值
页: [1]
查看完整版本: 为什么打印Baby I love you而不是打印小甲鱼