zoukankan      html  css  js  c++  java
  • 名称空间与作用域

    一丶名称空间

        名称空间是什么:存放名字的地方,是对栈区的划分,有了名称空间之后,就可以在栈区中存放相同的名字,名称空间分为三种

      1.1 内置名称空间

        存放的名字:存放的python解释器内置的名字

          存活周期:python解释器启动则产生,python解释器关闭则销毁

    '''
    >>> print
    <built-in function print>
    >>> input
    <built-in function input>
    '''

      1.2 全局名称空间    

        存放的名字:只要不是函数内定义、也不是内置的,剩下的都是全局名称空间的名字

          存活周期:python文件执行则产生,python文件运行完毕后销毁

    import sys #模块名sys
    
    x=1 #变量名x
    
    if x == 1:
        y=2 #变量名y
    
    def foo(x): #函数名foo
        y=1
        def bar():
            pass
    
    Class Bar: #类名Bar
        pass 

      1.3 局部名称空间

         存放的名字:在调用函数时,运行函数体代码过程中产生的函数内的名字

          存活周期:在调用函数时存活,函数调用完毕后则销毁

    def foo(x):
        y=3 #调用函数时,才会执行函数代码,名字x和y都存放于该函数的局部名称空间中

      1.4 名称空间的加载顺序

          内置名称空间>全局名称空间>局部名称空间

      1.5 销毁顺序

         局部名称空间>全局名空间>内置名称空间

      1.6 名字的查找优先级:

          当前所在的位置向上一层一层查找

          内置名称空间>全局名称空间>局部名称空间

    # 如果当前在局部名称空间:局部名称空间—>全局名称空间->内置名称空间
    input=333
    def func():
        input=444
        print(input)
    func()
    #先运行->444    注释444->333   注释444,333-><built-in function input>
    
    # 如果当前在全局名称空间:全局名称空间->内置名称空间
    input=333
    def func():
        input=444
    func()
    print(input)
    #先运行->333  注释333-><built-in function input>
    vive  
    # 示范1:
    def func():
        print(x)
    x=111
    func()
    
    # 示范2:名称空间的"嵌套"关系是以函数定义阶段为准,与调用位置无关
    x=1
    def func():
       print(x)
    def foo():
        x=222
        func()
    foo()
    
    # 示范3:函数嵌套定义
    input=111
    def f1():
        def f2():
            # input=333
            print(input)
        input=222
        f2()
    f1()
    
    # 示范4:
    x=111
    def func():
        print(x) 
        x=222
    func()
    案例

    二丶作用域

      全局作用域:内置名称空间、全局名称空间  全局存活,全局有效:被所有函数共享

        局部作用域: 局部名称空间的名字,临时存活,局部有效:函数内有效

    # 示范1:
    x=111
    def func():
        x=222 #局部区域内的名称与全局区域内无关
    func()
    print(x)
    
    # 示范2:如果再局部想要修改全局的名字对应的值(不可变类型),需要用global
    x=111
    def func():
        global x # 声明x这个名字是全局的名字,不要再造新的名字了
        x=222
    func()
    print(x)
    
    # 示范3:可变类型直接修改即可
    l=[111,222]
    def func():
        l.append(333)
    func()
    print(l)
    
    # nonlocal(了解): 修改函数外层函数包含的名字对应的值(不可变类型)
    x=0
    def f1():
        x=11
        def f2():
            nonlocal x
            x=22
        f2()
        print('f1内的x:',x)
    f1()
    
    def f1():
        x=[]
        def f2():
            x.append(1111)
        f2()
        print('f1内的x:',x)
    f1()
    关于在不同作用域内改值的操作


       



  • 相关阅读:
    不可或缺 Windows Native (15)
    不可或缺 Windows Native (14)
    不可或缺 Windows Native (13)
    不可或缺 Windows Native (12)
    不可或缺 Windows Native (11)
    不可或缺 Windows Native (10)
    不可或缺 Windows Native (9)
    不可或缺 Windows Native (8)
    不可或缺 Windows Native (7)
    不可或缺 Windows Native (6)
  • 原文地址:https://www.cnblogs.com/bk134/p/12525197.html
Copyright © 2011-2022 走看看