python命名空间和作用域

命名空间

namespace 命名空间(名称空间)

  1. 内置 命名空间: python解释器启动之后就可以使用的变量函数名
  2. 全局 命名空间:在函数外面的变量名函数名
  3. 局部 命名空间: 每一个函数都拥有自己的命名空间


python解释器运行 加载顺序:
所有 内置空间函数名变量===》逐行 加载全局空间变量函数名
局部空间的变量函数名:在调用函数的时候产生,调用结束就消失

 1 前面所讲:
 2     a = 1
 3     a = 3           #a = 3 把 a = 1 覆盖
 4     print(a)
 5     
 6     def len_c():
 7         pass
 8     def len_c():
 9         pass2
10     print(len_c)   是pass2   按加载顺序,len_c覆盖

作用域:

一个变量函数名 可以使用的区域

  1. 全局作用域: 内置空间 全局空间 的变量名函数名
  2. 局部作用域: 局部空间 变量名函数名

作用域链:

下级能用上级,反之不能 单向
下级 用 上级 不能 改 (想改的话,global 可以修改全局变量,nonlocal 修改局部变量,当前没有,向上级找,截止最后的局部空间寻找,在找不到,报错)

globals() 保存了全局变量和对应的值
print(globals)
locals() 保存了当前空间变量和对应的值
locals()
命名空间说白了,可以看做一个字典,字典key保存了当前空间的所有变量,,key对应的值就是变量的值
如果想要修改全局的变量:使用global关键字(尽量避免,会把全局相同的变量都给更改,就完蛋了)
如果想要修改外层函数的变量:使用nonlocal(不影响全局)

a = ’ddfdf‘         # a 全局空间  变量
def func1()         # func1  全局空间  函数名
    print()
    
def func2()      #func2  全局空间  函数名
    func1         # 局部空间 函数            函数func2内部没有func1,就去上级去找   (作用域链) 
    a = 1         #局部空间 变量
    print ()

函数嵌套:

def func()
    def func1()     #函数嵌套 定义
    .
    .
    func1             #函数嵌套 调用
    print(..)
--------

n = 0
def func1()
    n = 1
    def func2()
        n = 2
        def func3()
            n =3
            print(n)
        func3()       #调用func3
        print(n)
    func2()              #调用 func2
    print(n)

func1()       #调用func1
可以删除变量n 试一试

def func ():
    a =10
    b = 20
    print(locals())          #{'b': 20, 'a': 10}

func()
------------

global

n = 1
def func()
    global n
    n = n + 1     #不仅仅用,还把全局命名空间中的变量n的值修改了  (这种最好不用,太危险)
func()
print(n)   # 2
--------

n = 0
def func():
    n = 1
    def func1():
        def func2():
            nonlocal n     #修改局部变量   func2中没有,向上找func1,也没有,在向上func空间找,有变量n(如果还没有,报错)
            n += 1
            print(n)    # 2
        func2()
    func1()
func()
print(n)   # 0


n = 0
def func():
    n = 1
    def func1():
        def func2():
           global n             #直接去全局找n    (如果全局没有,报错)
            n += 1
            print(n)   # 1
        func2()
    func1()
func()
print(n)   # 1

golbals()   全局命名空间 的变量和值得集合  就是个字典
locals()    局部。。。。。。。。。。。。。
View Code

第一类对象:

  • 函数名可以赋值
  • 可以作为一个数据结构的元素
  • 可以作为一个函数的参数
  • 可以作为一个函数的返回值

所以函数名是第一类对象

原文地址:https://www.cnblogs.com/zhzhlong/p/7823274.html