鱼C论坛

 找回密码
 立即注册
查看: 2206|回复: 4

[已解决]第十九讲课后习题 全局和局部变量问题

[复制链接]
发表于 2020-2-28 11:44:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
为什么下面两组代码结果一样呢?第一组代码结果不应该是"Hi I love you"吗?一下子被全局和局部变量搞懵了,向大佬求助
var = ' Hi '

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

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

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

print(fun1())



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())

最佳答案
2020-2-28 12:20:21
本帖最后由 jackz007 于 2020-2-28 12:21 编辑

【代码1】:
  1. var = ' Hi '              # 定义 var 为全局变量

  2. def fun1():
  3.     var = ' Baby '        # var 被赋值,意味着它是一个局部变量,就是说,与同名全局变量无关
  4.     return fun2(var)      # 返回以 var 为参数对 fun2() 的调用结果

  5. def fun2(var):            # fun1() 中的输入参数 var 在 fun2() 中属于局部变量
  6.     var += 'I love you'   # var = var + 'I love you' = ' Baby I love you'
  7.     fun3(var)             # 以 var 为参数调用 fun3()
  8.     return var            # 把 var 作为函数值反馈给调用者

  9. def fun3(var):            # fun2() 中的输入参数 var 在 fun3() 中属于局部变量
  10.     var = ' 小甲鱼 '      # 修改局部变量 var,这个 var 只是输入变量的副本,所以,这个修改并不涉及 fun2() 中的 var

  11. print(fun1())             # 打印 fun1() 的函数值 ' Baby I love you'
复制代码


【代码2】:
  1. var = ' Hi '              # 定义 var 为全局变量

  2. def fun1():
  3.     global var            # 在本函数中,变量 var 为全局变量,意味着在本函数内,可以通过赋值改变该变量的值
  4.     var = ' Baby '        # 改变全局变量 var 的值 var = ' Baby '
  5.     return fun2(var)      # 返回以全局变量 var 为参数,对 fun2() 的调用结果

  6. def fun2(var):            # fun1() 中的输入参数 var 在 fun2() 中属于局部变量
  7.     var += 'I love you'   # var = var + 'I love you' = ' Baby I love you'
  8.     fun3(var)             # 以 var 为参数调用 fun3()
  9.     return var            # 把 var 作为函数值反馈给调用者

  10. def fun3(var):            # fun2() 中的输入参数 var 在 fun3() 中属于局部变量
  11.     var = ' 小甲鱼 '      # 修改局部变量 var,这个 var 只是输入变量的副本,所以,这个修改并不涉及 fun2() 中的 var

  12. print(fun1())             # 打印 fun1() 的函数值 ' Baby I love you'
复制代码


        【代码1】和【代码2】的打印结果完全一样,区别在 fun1() 中的这一句
  1.     var = ' Baby '
复制代码

        【代码1】修改的是 fun1() 的局部变量,【代码2】修改的是全局变量,这个区别可以通过最后打印全局变量 var 的内容的方法得到显现。
  1. print(fun1())
  2. print(var)
复制代码

        楼主不妨一试
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-2-28 11:48:27 | 显示全部楼层
第一个打印的是局部变量的var,但是它的返回值是fun2这个函数,所以
fun2也可以访问到fun1的var
可以试试在代码最后再加一行:
  1. print(var)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

发表于 2020-2-28 11:56:33 | 显示全部楼层
本帖最后由 一个账号 于 2020-2-28 11:58 编辑

首先执行 fun1(),这是 var 的值是 Baby(局部变量),然后执行 fun2(),这是 var 的值是 Baby I love you,因为它是在原来的基础上增加,然后执行 fun3(),这时 fun3() var 的值不会改变 fun2() var 的值,所以输出 Baby I love you

如果有帮助,别忘了设为【最佳答案】
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-2-28 12:20:21 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2020-2-28 12:21 编辑

【代码1】:
  1. var = ' Hi '              # 定义 var 为全局变量

  2. def fun1():
  3.     var = ' Baby '        # var 被赋值,意味着它是一个局部变量,就是说,与同名全局变量无关
  4.     return fun2(var)      # 返回以 var 为参数对 fun2() 的调用结果

  5. def fun2(var):            # fun1() 中的输入参数 var 在 fun2() 中属于局部变量
  6.     var += 'I love you'   # var = var + 'I love you' = ' Baby I love you'
  7.     fun3(var)             # 以 var 为参数调用 fun3()
  8.     return var            # 把 var 作为函数值反馈给调用者

  9. def fun3(var):            # fun2() 中的输入参数 var 在 fun3() 中属于局部变量
  10.     var = ' 小甲鱼 '      # 修改局部变量 var,这个 var 只是输入变量的副本,所以,这个修改并不涉及 fun2() 中的 var

  11. print(fun1())             # 打印 fun1() 的函数值 ' Baby I love you'
复制代码


【代码2】:
  1. var = ' Hi '              # 定义 var 为全局变量

  2. def fun1():
  3.     global var            # 在本函数中,变量 var 为全局变量,意味着在本函数内,可以通过赋值改变该变量的值
  4.     var = ' Baby '        # 改变全局变量 var 的值 var = ' Baby '
  5.     return fun2(var)      # 返回以全局变量 var 为参数,对 fun2() 的调用结果

  6. def fun2(var):            # fun1() 中的输入参数 var 在 fun2() 中属于局部变量
  7.     var += 'I love you'   # var = var + 'I love you' = ' Baby I love you'
  8.     fun3(var)             # 以 var 为参数调用 fun3()
  9.     return var            # 把 var 作为函数值反馈给调用者

  10. def fun3(var):            # fun2() 中的输入参数 var 在 fun3() 中属于局部变量
  11.     var = ' 小甲鱼 '      # 修改局部变量 var,这个 var 只是输入变量的副本,所以,这个修改并不涉及 fun2() 中的 var

  12. print(fun1())             # 打印 fun1() 的函数值 ' Baby I love you'
复制代码


        【代码1】和【代码2】的打印结果完全一样,区别在 fun1() 中的这一句
  1.     var = ' Baby '
复制代码

        【代码1】修改的是 fun1() 的局部变量,【代码2】修改的是全局变量,这个区别可以通过最后打印全局变量 var 的内容的方法得到显现。
  1. print(fun1())
  2. print(var)
复制代码

        楼主不妨一试
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

 楼主| 发表于 2020-2-28 20:18:29 | 显示全部楼层
看懂了,谢谢你的耐心解答
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-10-11 03:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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