第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
领鱼币
{:5_104:}求解答 本帖最后由 疾风怪盗 于 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 12:52
求解答
https://fishc.com.cn/thread-158897-1-1.html
你这头像绝了 疾风怪盗 发表于 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 12:45
领鱼币
有var=3时,会显示在定义前被使用,没有var=3时就能正常找到上面的var=5
感觉和js的预解析很像 看看我写的这个帖子的最后一个例子。刚好解释你的这个问题 我爱吃爆米花 发表于 2020-8-30 13:11
# 我现在疑惑的是:内部函数作用域不是规定如果不申明全局变量,不能访问外部函数的参数或变量吗,
# 比如 ...
这个没这么复杂吧,看变量的作用范围,你就想象画个圈,大圈套小圈,向下作用,我就是这么理解的
如果你要小圈内的变量在大圈外用,就申明全局变量,就跳出圈了 闭包了解一下,内部函数的变量不能修改外部函数变量
python没有声明的关键字比如 int var = 5
所以当你在 var = 5的时候他并不知道你是在声明还是赋值默认给你当成是声明
但是只是读取值的话 找不到就冒泡往外找 所以print(var)是可以的
而 var += 5 那就会报错了 届时你需要加上 nonlocal var它就能知道你是在给更外一层的作用域的变量赋值
页:
[1]