鱼C论坛

 找回密码
 立即注册
查看: 1996|回复: 11

[已解决]第19讲课后习题关于嵌套函数及作用域的的疑惑

[复制链接]
发表于 2020-8-30 12:39:01 | 显示全部楼层 |阅读模式

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

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

x
# 代码1:
def show(msg):
    num = 10
    def inner():
        print(num,msg)
    return inner()

show('fishC')
结果:10 fishC

# 代码2:
# def outside():
#     var = 5
#     def inside():
#         print(var)
#         var = 3
#
#     inside()
# outside()
结果:UnboundLocalError: local variable 'var' referenced before assignment

疑问:为什么代码1能print出10 fishC,不应该和代码2一样报错吗?num和msg不是外部的变量参数吗,inner为什么能调用作用域外的呢?
最佳答案
2020-8-30 13:12:09
看看我写的这个帖子的最后一个例子。刚好解释你的这个问题
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-8-30 12:45:46 | 显示全部楼层
领鱼币
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-30 12:52:41 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-30 12:54:24 | 显示全部楼层
本帖最后由 疾风怪盗 于 2020-8-30 13:02 编辑
  1. def outside():
  2.     var = 5
  3.     def inside():
  4.         print(var)
  5.         #var = 3
  6.     inside()
  7. outside()
复制代码

这段代码,你把var=3注释掉,就能正常运行

不知道是不是和js一样的,有个概念叫预解析,js遇到这样的,会输出undefined

网上搜了下,也没找到关于python,可能不一样的吧

点评

不一样的  发表于 2020-8-30 13:10
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-30 13:11:10 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-30 13:11:43 | 显示全部楼层
疾风怪盗 发表于 2020-8-30 12:54
这段代码,你把var=3注释掉,就能正常运行

不知道是不是和js一样的,有个概念叫预解析,js遇到这样的 ...

# 我现在疑惑的是:内部函数作用域不是规定如果不申明全局变量,不能访问外部函数的参数或变量吗,
# 比如不能操作代码3中var = var + 3
# 代码3:
def outside():
    var = 5
    def inside():
        var = var + 3
        print(var)
    inside()
outside()
结果:UnboundLocalError: local variable 'var' referenced before assignment
# 但为什么能能通过print输出外部所有的参数或变量呢?如代码4
# 代码24:
def show(msg):
    # 外部的变量
    num1 = 10
    def outer():
        num2 = 100
        def inner():
            print(num1,num2,msg)
        return inner()

    return outer()

show('FISHC')
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-30 13:12:03 | 显示全部楼层

回帖奖励 +1 鱼币


有var=3时,会显示在定义前被使用,没有var=3时就能正常找到上面的var=5
感觉和js的预解析很像
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-30 13:12:09 | 显示全部楼层    本楼为最佳答案   
看看我写的这个帖子的最后一个例子。刚好解释你的这个问题
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-30 13:16:18 | 显示全部楼层
我爱吃爆米花 发表于 2020-8-30 13:11
# 我现在疑惑的是:内部函数作用域不是规定如果不申明全局变量,不能访问外部函数的参数或变量吗,
# 比如 ...

这个没这么复杂吧,看变量的作用范围,你就想象画个圈,大圈套小圈,向下作用,我就是这么理解的

如果你要小圈内的变量在大圈外用,就申明全局变量,就跳出圈了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-30 15:57:53 | 显示全部楼层
闭包了解一下,内部函数的变量不能修改外部函数变量
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-31 10:15:36 | 显示全部楼层
python没有声明的关键字比如 int var = 5
所以当你在 var = 5的时候他并不知道你是在声明还是赋值  默认给你当成是声明
但是只是读取值的话 找不到就冒泡往外找 所以print(var)是可以的
而 var += 5 那就会报错了 届时你需要加上 nonlocal var  它就能知道你是在给更外一层的作用域的变量赋值
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-26 15:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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