小可爱. 发表于 2020-11-7 21:41:04

内嵌函数

这个B会报错 不理解    我的理解是   程序不是一步一步执行吗   虽然定义局部变量会把全局变量给屏蔽但是print是在var=3上面我觉得当执行到print的时候var还没有被屏蔽   我觉得应该能输出出来不知道我哪里理解有问题

笨鸟学飞 发表于 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出现了自定义的变量、函数、对象,都是向上寻找赋值语句)寻找函数定义过程

笨鸟学飞 发表于 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对调下,就不会报错了

Twilight6 发表于 2020-11-7 22:18:02



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

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


小可爱. 发表于 2020-11-8 11:49:37

笨鸟学飞 发表于 2020-11-7 21:56
======python的变量、函数、对象,如果不是python自有的,第一次出现必须是赋值语句
代码运行过程如下:
...

但是把内置函数的变量名字改一下就可以了啊
页: [1]
查看完整版本: 内嵌函数