鱼C论坛

 找回密码
 立即注册
查看: 785|回复: 2

《零基础入门学习Python》第20讲中内部函数中访问外部变量的问题

[复制链接]
发表于 2019-5-29 21:45:32 | 显示全部楼层 |阅读模式

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

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

x
在视频举例子中,小甲鱼有个闭包的例子:
def funx(x):
    def funy(y):
        return x*y
    return funy
在以上例子中,在funy中访问x是没有问题的,但在课后作业的第3题中,代码B如下:
def outside():
    var = 5
    def inside():
        print(var)
        var = 3
        
    inside()
outside()

在代码B中访问var就会出错,这两个有什么差别呢,视频中小甲鱼说在内部函数中,只能对外部函数的变量进行访问,不能进行修改,那么代码B中,print(var)只是访问,没有进行修改啊?
如果按照小甲鱼课后作业的答案,说var没有被定义前就使用了,那么第一段代码中的x在funy中也是没有被定义前就使用了啊?
想不明白,求解答
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-5-29 22:00:44 | 显示全部楼层
你看不明白,我怎么一看就明白了。
1,调用不同
2,还是调用不同 funx(x): 和outside():一个有参,一个没参,能一样吗?

话说你也说了是闭包,那么简单的想,可以把这2个函数想成一个有2个参数的函数,当然还是有区别的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-30 10:25:36 | 显示全部楼层
本帖最后由 都淡忘 于 2019-5-30 10:34 编辑

理解python对于变量的寻找原理,当搜索一个变量的时候,python先从局部作用域开始搜索,如果在局部作用域没有找到那个变量,就在全局变量中找这个变量,如果找不到抛出异常(NAMEERROR或者Unbound-LocalError),于是有
第一,在内部函数中不修改全局变量,但是可以访问全局变量
例:结果是5
def outside():
    var = 5
    def inside():
        print(var)
    inside()
outside()
第二,在内部函数中修改同名全局变量,则python会认为它是一个局部变量,也就是把外部的”屏蔽“了起来
例:结果是3
def outside():
    var = 5
    def inside ():
        var = 3
        print(var)
    inside()
outside()
第三,在内部函数修改同名全局变量之前调用变量名称,这是不允许的。理解寻找变量的过程。
例:报错
def outside():
    var = 5
    def inside ():
        print(var)
        var = 3
    inside()
outside()
在内部函数中,一行一行读,print(var),这里于是找var变量,内部并没有找到哦,于是外部,外部找到了,于是这个var变量是引用外部的var变量,下一段代码就错误了,尝试修改var变量,于是又认为var是局部变量,在内部妄图修改外部变量的值?拿前朝的剑斩本朝的官,于是就错误了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-16 03:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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