zoukankan      html  css  js  c++  java
  • 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

    第一类对象:

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

    所以函数名是第一类对象

  • 相关阅读:
    在Excel中查找/替换时使用换行符
    用fieldset标签轻松实现Tab选项卡效果
    用JSFL将Flash中的元件导出为PNG
    PHP学习笔记之PDO
    网页中的数学公式
    解决fl.findObjectInDocByType/fl.findObjectInDocByName的毛病
    HTML+CSS 网页中鼠标滚轮失效的解决办法
    jQuery 离开页面时提示
    ASP 计算出指定年份生肖
    au3创建Access数据库表例子
  • 原文地址:https://www.cnblogs.com/zhzhlong/p/7823274.html
Copyright © 2011-2022 走看看