函数的命名空间和作用域

一、命名空间

1.内置----python解释器

内置命名空间 —— python解释器

python解释器一启动就可以使用的名字存储在内置命名空间中,内置的名字在启动解释器的时候被加载进内存里

2.全局--自己写的代码

全局命名空间 —— 我们写的代码但不是函数中的代码

程序从上到下被执行的过程中依次加载进内存的,放置了我们设置的所有变量名和函数名

3.局部 — 函数

函数内部定义的名字,当调用函数的时候 才会产生这个名称空间 随着函数执行的结束 这个命名空间就又消失了

在局部:可以使用全局、内置命名空间中的名字
在全局:可以使用内置命名空间中的名字,但是不能用局部中使用
在内置:不能使用局部和全局的的

def func():
    a = 1
func()
print(a)	# 错误,不能使用局部变量

def max():
    print('in max func')
print(max())
	在正常情况下,直接使用内置的名字,当我们在全局定义了和内置名字空间中同名的名字时,会使用全局的名字,当我自己有的时候就不会找上级要了,如果自己没有,就找上一级要,上一级没有再找上一级,如果内置的名字空间都没有,就报错。
#多个函数应该拥有多个独立的局部名字空间,不互相共享
 def input():
     print('in input now ')

 def func():
     #input = 1
     input()

 func()

#func --->函数的内存地址 (函数名代表的是函数的内存地址)
#函数名() 函数的调用
#函数的内存地址()函数的调用

二、作用域

1.全局作用域

-- 作用在全局 -- 内置和全局名字空间都属于全局作用域 global()查看全局的变量

 a = 1
 def func():
    global a	# 使用global声明后,就可以修改全局变量
     a = 2

func()
print(a)

2.局部作用域

-- 作用在局部 -- 函数(局部名字空间属于局部作用域) locals()可以查看局部的变量

	对于不可变数据类型 在局部可是查看全局作用域中的变量,但是不能直接修改,如果想要修改,需要在程序的一开始添加global声明,如果在一个局部(函数)内声明了一个global变量,那么这个变量在局部的所有操作将对全局的变量有效。
a = 1
b = 2
def func():
     x = 'aaa'
     y = 'bbb'
     print(locals())
func()
print(globals())
print(locals())
#globals 永远打印全局的名字
#locals 输出什么,根据locals所在的位置

a = 1
def func(a):
    a = 2
    return a
a = func(a)
print(a)

三、函数的嵌套定义

1.内部函数可以使用外部函数的变量

a = 1
def  outer ():
    a = 1
    def inner():
        b = 2
        print(a)
        print('inner')
        def inner2():
            nonlocal a #声明了一个上面第一层局部变量
            #global a    #声明了一个全局变量
            a += 1      #不可变数据类型的修改
        inner2()
    inner()
    print('**a**',a)

outer()
print('全局:',a)
	nonlocal 只能用于局部变量 找上层中离当前函数最近一层的局部变量,声明了nonlocal的内部函数的变量,修改会影响到 离当前函数最近一层的局部变量,对全局无效,对局部 也只是对最近的一层 有影响。
func()  			  #函数名就是内存地址
 func2 = func    #函数名可以赋值
 func2()

 l = [func,func2]    #函数名可以作为容器类型的元素
 print(l)
 for i in l:
     i()

def func():
    print(123)

def wahaha(f):
    f()
    return f    #函数名可以作为函数的返回值

qqxing = wahaha(func)   #函数名可以作为函数的参数
qqxing()

浩瀚学海,虔诚分享!

posted @ 2020-03-10 20:07  aitansi  阅读(92)  评论(0编辑  收藏  举报