Archie27 发表于 2019-11-15 10:47:31

零基础入门学习python:课后作业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())
为什么打印出来的不是'小甲鱼'啊?在fun2(var)里最后不是把var改成了'小甲鱼'了么...
请帮帮我,谢谢!

jackz007 发表于 2019-11-15 11:12:43

本帖最后由 jackz007 于 2019-11-15 11:17 编辑

var = ' Hi '               # 全局变量 var 赋初值 ' Hi '

def fun1():
    global var             # 声明全局变量 var,从此,在 fun1() 函数内部,全局变量 var 可访问,可赋值(如果没有此句,那就只能访问,不能赋值)
    var = ' Baby '         # 用新内容 ' Baby ' 覆盖 var 的原有内容 ' Hi '
    return fun2(var)       # 用对函数 fun2(var) 的调用结果作为本函数的调用结果返回

def fun2(var):             # var 是 fun2() 的形式参数,所以,在 fun2() 内部,var 只是一个局部变量,与外部的同名全局变量无关
    var += 'I love you'    # 从 fun1() 传入的 var = ' Baby ',所以,此刻,var = ' Baby I love you'
    fun3(var)            # 以 var 为参数调用 fun3()
    return var             # 返回局部变量 var 的值 ' Baby I love you',同时,也是对函数 fun1() 调用的返回结果

def fun3(var):             # var 是 fun3() 的形式参数,属于局部变量
    var = ' 小甲鱼 '       # 函数内部对局部变量的修改不会影响到函数以外,也就是说,不会传递到外层函数 fun2() 中,所以,这个修改可以忽略

print(fun1())            # 打印结果:' Baby I love you'

zltzlt 发表于 2019-11-15 19:24:55

在 fun3 中 var = ' 小甲鱼 ' 只是对局部变量 var 进行了修改,并不影响全局变量 var。

Archie27 发表于 2019-11-15 20:36:48

jackz007 发表于 2019-11-15 11:12


我不明白既然var可以从fun1()传到fun2(),为什么不能从fun2()传到fun3()呢?

Archie27 发表于 2019-11-15 20:37:29

zltzlt 发表于 2019-11-15 19:24
在 fun3 中 var = ' 小甲鱼 ' 只是对局部变量 var 进行了修改,并不影响全局变量 var。

fun2中不也是局部变量么

jackz007 发表于 2019-11-15 20:50:48

Archie27 发表于 2019-11-15 20:36
我不明白既然var可以从fun1()传到fun2(),为什么不能从fun2()传到fun3()呢?

      传进去没问题,而且,事实上也传进去了,但是,重点是,在 fun3() 内对 var 的修改与外层函数 fun2() 中的同名变量 var 无关,就是说,这些修改不会改变 fun2() 中 var 的内容。

Archie27 发表于 2019-11-16 10:42:20

jackz007 发表于 2019-11-15 20:50
传进去没问题,而且,事实上也传进去了,但是,重点是,在 fun3() 内对 var 的修改与外层函数 fu ...

那fun2()中对var的修改为什么可以实现呢?这和fun3()中对var的修改的区别在哪呢?

jackz007 发表于 2019-11-16 10:51:26

本帖最后由 jackz007 于 2019-11-16 10:53 编辑

Archie27 发表于 2019-11-16 10:42
那fun2()中对var的修改为什么可以实现呢?这和fun3()中对var的修改的区别在哪呢?

   没错,在 fun2() 中对 var 的修改同样不会传递回外层调用函数 fun1(),可是,fun2() 中的 return var 语句把 var 作为结果返回到 fun1(),而 fun1() 中,return fun2(var) 又把 fun2() 返回的结果作为自己的结果返回,所以,fun2() 中的局部变量 var 的内容就这么冲出了重重包围 ,跑到了函数外面,最后被显示到了屏幕上。

Archie27 发表于 2019-11-16 11:43:03

jackz007 发表于 2019-11-16 10:51
没错,在 fun2() 中对 var 的修改同样不会传递回外层调用函数 fun1(),可是,fun2() 中的 return...

那既然fun2()返回的结果是var且不能对fun1()中的var做出修改,那这个var的内容是什么呢?是' I love you '吗?如果是的话,那再回到fun1()中,return出来的结果不是应是' I love you '吗?打印结果应该没有' baby '吧?
我是哪里理解得不对呢?{:5_99:}

jackz007 发表于 2019-11-16 11:54:54

本帖最后由 jackz007 于 2019-11-16 11:59 编辑

Archie27 发表于 2019-11-16 11:43
那既然fun2()返回的结果是var且不能对fun1()中的var做出修改,那这个var的内容是什么呢?是' I love you...

      都解释到了这个程度还在问,我也是醉了!

      这样吧,你把这个记住就好了,在函数内对任何变量的修改(包括函数的输入参数)其影响范围仅限于本函数内部,除非这个变量是全局变量。

Archie27 发表于 2019-11-16 12:29:31

jackz007 发表于 2019-11-16 11:54
都解释到了这个程度还在问,我也是醉了!

      这样吧,你把这个记住就好了,在函数内对任何 ...

好的,非常感谢!
页: [1]
查看完整版本: 零基础入门学习python:课后作业019_测试题4