函数命名空间和作用域

namespace 命名空间(名称空间)

内置 命名空间: python解释器启动之后就可以使用的变量\函数名

  全局 命名空间:在函数外面的变量名\函数名

  局部 命名空间: 每一个函数都拥有自己的命名空间

 

python解释器运行 加载顺序:

  所有 内置空间函数名\变量===》逐行 加载全局空间变量\函数名

  局部空间的变量\函数名:在调用函数的时候产生,调用结束就消失

例如:

    a = 1
    a = 3           #a = 3 把 a = 1 覆盖
    print(a)
    
    def len_c():
        pass
    def len_c():
        pass2
    print(len_c)   # 是pass2   按加载顺序,len_c覆盖

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

  全局作用域: 内置空间 全局空间 的变量名\函数名

  局部作用域: 局部空间 变量名\函数名

作用域链:

  下级能用上级,反之不能 单向

  下级 用 上级 不能 改 (想改的话,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

global和nonloacl

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() 局部。。。。。。。。。。。。。

======

第一类对象:

  函数名可以赋值

  可以作为一个数据结构的元素

  可以作为一个函数的参数

  可以作为一个函数的返回值

 

posted @ 2017-10-18 12:02  静静别跑  阅读(135)  评论(0编辑  收藏  举报