zoukankan      html  css  js  c++  java
  • 函数命名空间和作用域

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

    ======

    第一类对象:

      函数名可以赋值

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

      可以作为一个函数的参数

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

  • 相关阅读:
    桌面应用程序ClickOne打包部署
    Linux系统基础5周入门精讲(Linux发展过程)
    Linux系统基础5周入门精讲(服务器介绍)
    算法进阶--动态规划
    行为型模式
    结构型模式
    设计模式
    哈希表--树
    数据结构
    查找排序相关面试题
  • 原文地址:https://www.cnblogs.com/zhzhlong/p/9276894.html
Copyright © 2011-2022 走看看