鱼C论坛

 找回密码
 立即注册
查看: 2480|回复: 6

关于函数的作用域问题还是有一点不明白

[复制链接]
发表于 2020-2-27 16:13:13 | 显示全部楼层 |阅读模式

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

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

x
代码A:
>>>def outside():
       var = 5
       def inside():
           var = 3
           print(var)
       inside()
>>>outside()
3
代码B:
>>>def outside():
       var = 5
       def inside():
           print(var)
           var = 3        
       inside()
>>>outside()
Traceback (most recent call last):
  File "<input>", line 11, in <module>
  File "<input>", line 8, in outside
  File "<input>", line 5, in inside
UnboundLocalError: local variable 'var' referenced before assignment
代码C:
>>>def outside():
       var = 5
       def inside():
           print(var)        
       inside()
>>>outside()
5
问题:这是小甲鱼的课后题,代码B会出错小甲鱼给的理由是:“这里 outside() 函数里有一个 var 变量,但要注意的是,内嵌函数 inside() 也有一个同名的变量,Python 为了保护变量的作用域,故将 outside() 的 var 变量屏蔽起来,因此此时是无法访问到外层的 var 变量的。”
但是代码C为什么又不会出错呢?我自己的想法是内部函数是可以访问外部函数的局部变量的,但是如果不加‘弄nonlocal’关键字的话是不能够修改的,这里的代码B出错是因为访问了var之后Python将var视为外部函数的局部变量因此无法修改,当再执行var = 3的时候就会报错。
不知道这样理解对不对,有没有哪位鱼油能给一点专业+通俗的解释??

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
qiuyouzhi + 1 + 1 理解的是对的,只能使用,不能修改

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-2-27 16:15:18 | 显示全部楼层
因为不在一个作用域里,所以只能输出,不能操作
也就是“可远观而不可亵玩焉”
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-27 16:17:07 | 显示全部楼层
理解的是对的,只能看,不能操作
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-27 16:17:44 | 显示全部楼层
理解的是对的,只能使用,不能修改
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-28 10:29:31 | 显示全部楼层
qiuyouzhi 发表于 2020-2-27 16:15
因为不在一个作用域里,所以只能输出,不能操作
也就是“可远观而不可亵玩焉”

谢谢哈
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-28 10:30:36 | 显示全部楼层
假面的假面 发表于 2020-2-27 16:26
抛除你所有abc这三段代码,你直接编写一个语句print(var)并运行,请注意查看报错信息,是不是报错信息一致 ...

嗯嗯,谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-28 10:36:14 | 显示全部楼层

如果有帮助,请设最佳答案
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-22 23:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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