函数(2):命名空间与作用域 + 闭包

时间:2021-05-12 22:47:49

一、命名空间与作用域

在一段代码执行的时候,解释器自上而下将代码读入,在遇到函数时,并不会直接将函数体读入,而是仅仅在内存中记录下该函数名,当程序调用函数时,才会另外开辟一块内存空间,在其中运行该函数,这就涉及到了命名空间的概念

函数(2):命名空间与作用域 + 闭包

 

1、 命名空间

见上图,不再赘述

 

2、作用域

作用域和命名空间是两个不能分开说的概念,作用域顾名思义,就是作用范围,按照范围可分为全局作用域局部作用域

2.1  全局作用域

全局作用域包括全局命名空间、内置命名空间,在程序的任意位置都可以引用,包括函数内部

2.2  局部作用域

局部作用域包括局部命名空间,只能在局部范围内生效,比较函数内部定义的变量,只能在函数内部调用,外部无法读取到这些变量

 

*3、global(慎用)和nonlocal关键字

31.  golbal

x = 10
def func():
global x
x = 20

print('x=',x)
func()
print('x=',x)

  如果没有用global,func()函数内部对x = 20的修改对外部的x = 10是不能生效的,但是global的作用就是将x定义为全局变量,执行结果如下:

x = 10
x = 20

3.2  nonlocal

nonlocal用法同global,但是nonlocal有一些特性:

1)外部必须有这个变量,且内部的修改只能影响到有这个变量的上一层

2)内部的修改若想生效,不能在外部函数的上一层

3)内部修改这个变量如果想在外部有这个变量的第一层函数中生效

二、函数名的本质与函数的嵌套

函数(2):命名空间与作用域 + 闭包

1、函数名(不带括号和参数)

函数名本质上就是函数在内存中的地址,可以作变量名用,见上图。

 

2、函数嵌套和闭包

2.1  嵌套

函数的嵌套有定义时的嵌套调用时的嵌套

定义时的嵌套要注意内部调用或返回(此项与闭包有关)

2.1  闭包

def outer():
name = 'mark'
def inner():
print(name)
inner()
return

outer()

  如上面代码所示,在函数outer()内部定义一个inner()函数,这个inner()函数在全局作用域内是无法调用的,也就是对全局来说,Inner()是封闭的,而对外层函数来说,inner()又包含了外部outer()的name变量一个封闭一个包含,也就是“闭包”名称的来源

  闭包是一个非常重要的概念,是函数装饰器的核心部分,下面是闭包最常用的方法:

def outer():
name = 'mark'
def inner():
print(name)
return inner


f = outer() #此时f = inner
f() #相当于执行inner()