函数进阶

名称空间

python解析器执行时,每当遇到一个变量的时候,就把变量名和值之间对应的关系记录在内存空间中,这个空间叫全局命名空间

如果遇到函数,只把函数名读入内存,当执行函数时,解析器会在在内存中创建一个临时king见,然后执行函数内部程序,

函数结束时,临时空间消失,开辟的临时的空间叫做局部命名空间

命名空间分为三种:

①全局命名空间

②局部命名空间

③内置命名空间

加载顺序:内置、全局、局部

取值顺序:局部、全局、内置

作用域:

全局作用域:包含内置名称空间、全局名称空间,在任意位置都能被引用,作用于全局

局部作用域:只有函数内部可以调用

globals和locals方法:

name = 'wusir'
def func():
    name = 'alex'
    print(globals())
    print(locals())
func()
#{'__name__': '__main__', '__doc__': None,.................'                      全局
#{'name': 'alex'}                                                                 局部 

函数嵌套练习:

print(111)
def fun2():
    print(222)
    def fun3():
        print(666)
    print(444)
    fun3()
    print(888)
print(333)
fun2()
print(555)

输出:1 3 2 4 6 8 5

global关键字,nonlocal关键字:

global()声明一个全局变量,在函数中声明,全局都可以使用(限于数字和字符串)

a = 2
def func():
    global a
    a = 3
func()
print(a) #在函数内部声明的a 作用于全局,覆盖函数之前的值,如果在函数下面声明 a = 5, 那么输出5 #输出:3

   如果为可变数据类型,则不需要加global

l1 = [1,2,3]
def func():
    l1.append(444)
func()
print(l1)
#输出:[1, 2, 3, 444]

nonlocal:不能修改全局变量

                 在局部作用域中,对父级作用域(或者更外层作用域非全局作用域)的变量进行引用和修改,并且引用的哪层,从那层及以下此变量全部发生改变

a = 1
def func():
    nonlocal a
    a = 2
    print(a)
func()
#报错,因为nonlocal只能在函数中修改他的父级,由于他的父级是全局,所以报错
def func():
    name = 'A'               
    def inner():
        nonlocal name
        name = 'B'
        print(name)
    print(name)
    inner()
    print(name)           #由于此层级的name已经被 nonlocal 改变了值,所以输出B
func()
#输出:     A  
           B
           B
原文地址:https://www.cnblogs.com/pygg/p/8400263.html