我爱吃爆米花 发表于 2020-8-30 12:39:01

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

# 代码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 12:45:46

领鱼币

我爱吃爆米花 发表于 2020-8-30 12:52:41

永恒的蓝色梦想 发表于 2020-8-30 12:45
领鱼币

{:5_104:}求解答

疾风怪盗 发表于 2020-8-30 12:54:24

本帖最后由 疾风怪盗 于 2020-8-30 13:02 编辑

def outside():
    var = 5
    def inside():
      print(var)
      #var = 3
    inside()
outside()
这段代码,你把var=3注释掉,就能正常运行

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

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

永恒的蓝色梦想 发表于 2020-8-30 13:11:10

我爱吃爆米花 发表于 2020-8-30 12:52
求解答

https://fishc.com.cn/thread-158897-1-1.html
你这头像绝了

我爱吃爆米花 发表于 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')

疾风怪盗 发表于 2020-8-30 13:12:03

永恒的蓝色梦想 发表于 2020-8-30 12:45
领鱼币

有var=3时,会显示在定义前被使用,没有var=3时就能正常找到上面的var=5
感觉和js的预解析很像

sunrise085 发表于 2020-8-30 13:12:09

看看我写的这个帖子的最后一个例子。刚好解释你的这个问题

疾风怪盗 发表于 2020-8-30 13:16:18

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

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

如果你要小圈内的变量在大圈外用,就申明全局变量,就跳出圈了

我不是高富帅 发表于 2020-8-30 15:57:53

闭包了解一下,内部函数的变量不能修改外部函数变量

kogawananari 发表于 2020-8-31 10:15:36

python没有声明的关键字比如 int var = 5
所以当你在 var = 5的时候他并不知道你是在声明还是赋值默认给你当成是声明
但是只是读取值的话 找不到就冒泡往外找 所以print(var)是可以的
而 var += 5 那就会报错了 届时你需要加上 nonlocal var它就能知道你是在给更外一层的作用域的变量赋值
页: [1]
查看完整版本: 第19讲课后习题关于嵌套函数及作用域的的疑惑