Day4_名称空间与作用域
函数嵌套:
函数的嵌套调用:在调用一个函数的过程中,又调用了了另外一个函数
比如说比较多个值的大小,可以利用这种方法:
def max2(x,y): if x > y: return x else: return y def max4(a,b,c,d): res1=max2(a,b) res2=max2(res1,c) res3=max2(res2,d) return res3 print(max4(1,2,3,4))
函数的嵌套定义:在一个函数的内部,又定义了另外一个函数。
名称空间: 存放名字的地方,准确的说名称空间是存放名字与变量值绑定关系的空间。
分为三种空间:
内置名称空间: python自带的名字,在python解释器启动时产生,存放一些python内置的名字。
全局名称空间: 在群居都能使用的定义,在执行文件时,存放文件级别定义的名字。
局部名称空间: 在执行文件的过程中,如果调用了函数,则会产生该函数的局部名称空间。用来存放该函数内定义的名字。在函数调用时生效,在函数调用结束后失效。
加载顺序; 内置---》全局-----》局部
定义的名字查找顺序:自下而上的查找
当定义了两个相同的函数,以后定义的为准:
def func0(): print('1111111') def func0(): print('2222222') func0()
作用域:作用的范围
全局作用域:全局存活,全局有效
局部作用域:临时存活,只能在函数内访问
global 和 nonlocal 关键字:
x=1 def f1(): global x #意思是在局部改掉全局的变量或者定义 x=2 f1() print(x) 如果全局是可变类型的时候,可以改变全局类型 l=[] def f2(): l.append('f2') f2() print(l)
改掉函数内部上一层的变量,只在函数内部有效,如果上层没有的话,再向上找,不能改掉全局的
def f1(): x=1 def f2(): x=2 def f3(): nonlocal x x=3 f3() f2() f1() print(x)
作用域关系,在函数定义的时候就已经固定好了,于调用位置无关。
x=1 def f1(): def f2(): print(x) return f2 #相当于函数当做返回值,这里没有括号 #如果此时令func=f1(),即此时func=f2 func=f1() print(func)