鱼C论坛

 找回密码
 立即注册
查看: 1243|回复: 5

python 020讲课后测试第3题关于内嵌函数的问题请教

[复制链接]
发表于 2018-5-2 22:03:58 | 显示全部楼层 |阅读模式

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

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

x
3题中A、B代码中区别在于:打印语句print(var)与赋值语句var=3互换。但为什么互换就不行报错呢?之前不是说过如果修改一个外部变量,就会就建立一个局部的同名变量吗?如果在A代码inside()加上第一句的print(var),象这样:

1 def outside():
2        var =5
3        def inside():
4                print(var)
5                var=3
6                print(var)
7        inside()

这个代码是不是应该解释为语句4、打印outside()中var的值=5;语句5、建立一个同名局部变量var,赋值3;6打印这个同名局部变量var的值=3。但是为什么会报错呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-5-2 22:35:11 | 显示全部楼层
本帖最后由 故梦L 于 2018-5-2 22:37 编辑
  1. def outside():
  2.     var =5
  3.     def inside():
  4.        # print(var)#var是变量,需被赋值,否则报错;     
  5.         var = 3
  6.         print(var)
  7.     inside()
  8. outside()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-2 22:48:08 | 显示全部楼层

第4句的print(var)不是已被赋值了吗?因为如果去掉语句5和6,象这样:
def outside():
    var =5
    def inside():
       print(var)  #var是变量,需被赋值,否则报错(var在outside()中被赋值了);     
        #var = 3 #不要这句
        #print(var) #也不要这句
    inside()
outside()

运行结果是 5。所以不明白加上语句5、6为什么就报错了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-2 22:48:41 | 显示全部楼层
本帖最后由 一鱼 于 2018-5-2 22:57 编辑

A没有报错是因为在内部函数print的时候var已经定义了var=3
B报错是因为没有定义,你可能觉得外面定义了var=5,但是var=5对于内部函数来说是屏蔽的,这时候程序知道有一个局部同名变量但是没有赋值 ,所以不能print,A的内部函数就是先定义了一个局部的同名变量,所以A才能print(你也可以看到结果是内部函数定义的3)
你的代码同样是B的错误,在第一次print时对于内部函数var没有被赋值,所以报错
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-2 22:58:11 | 显示全部楼层
一鱼 发表于 2018-5-2 22:48
A没有报错是因为在内部函数print的时候var已经定义了var=3
B报错是因为没有定义,你可能觉得外面定义了var ...

可是象这样注释掉inside()函数里的后面两句,运行结果就是inside()这个内部函数能访问outside()定义的var,这不是说var是这个内部函数可见的吗?
def outside():
    var =5
    def inside():
        print(var)     
    #   var = 3
    #   print(var)
    inside()
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-2 23:00:34 | 显示全部楼层
DCH 发表于 2018-5-2 22:58
可是象这样注释掉inside()函数里的后面两句,运行结果就是inside()这个内部函数能访问outside()定义的var ...

但是当你var在内部再次被定义的时候外面的var就被屏蔽了,你这时候输出var就没有被赋值
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-29 22:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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