函数的命名空间,作用域

来源:转载

一:为什么要有命名空间?


两个函数求最大值,return函数的最大值,并将它打印出来了,那么能直接打印吗?看下面的函数


eg1:


def max(x,y):
z=x if x>y else y
return z
bigger=max(16,20)
print(bigger)

打印结果:20


如果是这样呢?


eg2:


def max(x,y):
z=x if x>y else y
max(16,20)
print(z)

打印结果:



为什么会报错?


因为我们进行打印,打印的是全局变量,内部变量z没有被定义,全局变量不能引用内部变量。


也就是说:


从python解释器开始执行的时候,就在内存开辟出了一个空间。


没遇到一个变量就会把变量名和值的对应关系记录下来。


但是当遇到函数定义的时候,python解释器只是象征性的将函数关心读入内存(表示则这个函数已经存在,至于内部逻辑和变量解释器并不关心)


等到函数调用的时候,python解释器会在内存中再开辟一个内存来存储函数里面内容, 这个时候,才关注函数里面有哪些变量,而函数中的变量会存储在新开辟出来的内存中。函数中的变量只能在函数的内部使用,并且会随着函数执行完毕,这块内存中的所有内容也会被清空。


这个存放名字与值的关系的空间就是命名空间


代码从运行开始,创建的存储名字和值的关系空间就是全局命名空间,而在函数运行过程中临时开辟空间就是局部命名空间。

二:命名空间的本质:存放名字与值的绑定关系


python之禅:


打开cmd命令在python解释器中输入import this



三:命名空间种类


内置命名空间 全局命名空间 局部命名空间


内置命名空间:存放python解释器提供的关键字:sum,print,str,list等50多种内置关键字。


四:三种命名空间的加载和取值顺序


加载顺序:


内置(程序运行前加载)----全局(程序运行中,从上到下加载)-----局部(程序运行中,调用才加载)


取值顺序:


在局部中:


局部--全局---局部(儿子可以花老子的钱,老子不能花儿子钱)


a=1
def max():
a=2
return a
rr=max()
print(rr)
print(a)

打印结果:2,1


在全局:全局---局部


x = 1
def f(x):
print(x)
f(10)
print(x)

打印结果:10,1


四:作用域


作用域就是作用范围,按照生效范围可分为全局作用域和局部作用域


全局作用域:包括全局命名空间和内置命名空间,整个文件任意位置被引用,全局生效。


局部作用域:只在局部命名空间内,局部范围有效。


globals和locals


def func():
a = 12
b = 20
print(locals())
print(globals())
func()

打印结果



global:声明函数在全局有效


a = 10
def func():
global a
a = 20
print(a)
print(a)
func()
print(a)

他的执行顺序



执行结果:



函数嵌套调用:


def max2(x,y):
m= x if x>y else y
return m
def max4(a,b,c,d):
res1 = max2(a,b)
res2 = max2(res1,c)
res3 = max2(res2,d)
return res3
print(max4(23,-7,31,11))
print(max2(10,20))

显示结果:


函数的嵌套定义


eg1:


def f1():
print("in f1")
def f2():
print("in f2")
f2()
f1()

eg2:


def f1():
def f2():
def f3():
print("in f3")
print("in f2")
f3()
print("in f1")
f2()
f1()

函数的作用域链


def f1():
a = 1
def f2():
a = 2
f2()
print('a in f1 : ',a)
f1()

global适用于函数内部修改全局变量的值


nonlocal适用于嵌套函数中内部函数修改外部变量的值


def f1():
a = 1
def f2():
nonlocal a
a = 2
f2()
print('a in f1 : ',a)
f1()

打印结果:2


'a in f1 : ',2

分享给朋友:
您可能感兴趣的文章:
随机阅读: