鱼C论坛

 找回密码
 立即注册
查看: 2059|回复: 4

[已解决]内嵌函数

[复制链接]
发表于 2020-11-7 21:41:04 From FishC Mobile | 显示全部楼层 |阅读模式

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

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

x
Screenshot_2020-11-06-16-20-07.jpg 这个B会报错 不理解    我的理解是   程序不是一步一步执行吗   虽然定义局部变量会把全局变量给屏蔽但是print  是在var=3上面  我觉得当执行到print的时候  var还没有被屏蔽   我觉得应该能输出出来  不知道我哪里理解有问题
最佳答案
2020-11-7 22:18:02


屏蔽机制是相对于一个作用域空间而言的,即:当你这个命名空间里的 var 被重新赋值时候,就会导致这个作用空间触发屏蔽机制

所以因为你内嵌函数内对 var 重新赋值了,导致在这个空间内,已经屏蔽了外部的 var 变量,导致触发 var 没有定义而报错


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-11-7 21:56:55 | 显示全部楼层
======python的变量、函数、对象,如果不是python自有的,第一次出现必须是赋值语句
代码运行过程如下:
def outside():    #2、定义函数
        var = 5      #3、函数outsidi()内变量赋值
        def inside():     #5、定义函数内的函数
                print(var)   #6、打印inside()函数内的局部变量,前面并没有赋值语句,因此会报错
                var = 3   #7、重新赋值
        inside()      #4、看缩进,这里才是第4步,然后向上找同等缩进的函数定义

outside()  #1、注意看缩进,其他都是定义函数语句,因此这里是第一步,下一步则向上(注意理解上面的话,所以python出现了自定义的变量、函数、对象,都是向上寻找赋值语句)寻找函数定义过程
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-7 22:01:11 | 显示全部楼层
如果还不理解,我这么再给你分析下代码:
1、outside()
2、var = 5  -----outside函数内局部变量
3、inside()
4、print(var)---这个var是指的inside()函数内的局部变量,第一次出现这个变量,并不是赋值语句,因此会报错的
5、var =3-----inside函数内局部变量

4和5对调下,就不会报错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-7 22:18:02 | 显示全部楼层    本楼为最佳答案   


屏蔽机制是相对于一个作用域空间而言的,即:当你这个命名空间里的 var 被重新赋值时候,就会导致这个作用空间触发屏蔽机制

所以因为你内嵌函数内对 var 重新赋值了,导致在这个空间内,已经屏蔽了外部的 var 变量,导致触发 var 没有定义而报错


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-11-8 11:49:37 From FishC Mobile | 显示全部楼层
笨鸟学飞 发表于 2020-11-7 21:56
======python的变量、函数、对象,如果不是python自有的,第一次出现必须是赋值语句
代码运行过程如下:
...

-4769b8a3e06c927.png 但是把内置函数的变量名字改一下就可以了啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-18 00:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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