Fork me on GitHub

【进阶08】【自学笔记】Python命名空间和作用域、以及闭包

一、命名空间

1、定义:

命名空间(Namespace)是从名称到对象的映射,大部分的命名空间都是通过 Python 字典来实现的

 

2、三种命名空间:

  • 内置名称(built-in names), Python 语言内置的名称,比如函数名 abs、char 和异常名称 BaseException、Exception 等等。
  • 全局名称(global names),模块中定义的名称,记录了模块的变量,包括函数、类、其它导入的模块、模块级的变量和常量。
  • 局部名称(local names),函数中定义的名称,记录了函数的变量,包括函数的参数和局部定义的变量。(类中定义的也是)

 

3、命名空间查找顺序:

假设我们要使用变量 python,则 Python 的查找顺序为:局部的命名空间 -> 全局命名空间 -> 内置命名空间

如果找不到变量 python,它将放弃查找并引发一个 NameError 异常:NameError: name 'python' is not defined。

4、实例展示:

tatal=0  #定义全局变量
def sum(arg1,arg2):
    total=arg1+arg2   #total在这里是局部变量
    return total

print(sum(1, 2))

#修改全局变量(global)
num=1
def fun1():
    #global 关键字全局变量申明
    global num
    print(num)
    num=2311
    print(num)
fun1()
1
2311

 

#使用nonlocal修改嵌套作用域(闭包)的变量
def outer():
    num=10
    def inner():
        nonlocal num  #nonlocal 关键字申明
        print(num)
        num=100
        print(num)
    inner()
outer() 

 结果:

10
100

 

二、闭包

闭包定义:

函数里面同时包含两个def,且内函数运用了外函数的临时变量,外函数的返回值,是内函数的应用(外函数在结束的时候发现有自己的临时变量将来会在内部函数中用到,就把这个临时变量绑定给了内部函数,然后自己再结束。)

示例:

def outer(a):
    b=10
    def inner():
        #在内函数中,用到了外函数的临时标量
        print(a+b)
    #外函数的返回值是内函数的引用
    return inner()


print(outer(5))

#修改闭包变量的实例(nonlocal)
def outer(a):
    b=10
    def inner():
        #内函数想修改闭包中的变量
        nonlocal  b
        b=b+1

        print(a+b)
    return inner()

print(outer(5)) 

 结果:

16
None

  

 

  

  

 

posted @ 2022-01-21 15:30  橘子偏爱橙子  阅读(77)  评论(0编辑  收藏  举报