命名空间

命名空间

内置名称空间

计算机或程序底部自有的空间

全局名称空间

全局名称空间包括全局空间和内置空间,可以访问第一层的内容

 局部名称空间

局部的空间,没有内置和全局权限大

a = 10 # 全局名称空间中的内容
b = 10
def fn(): # fn也在全局名称空间
    b = 20 # 局部名称空间
print(b)
def gn():
    a = 30
    print(a)
fn() >>>#结果: 10
gn() >>>#结果: 30

作用域

全局作用域

内置+全局

可以访问全部的内容,也有权修改

局部作用域

局部(函数被调用)

只可修改当前参差空间的内容,如果想修改全局作用域的内容在第一行写global+调用的内容,再加以修改

globals() 查看全局中的内容

locals() 查看当前作用域中的内容

a = 110 # 全局
def fn(): #
    b = 20 # 局部
    def gn(): # 局部
        print(globals())  # 可以查看全局作用域中的内容 :>>> '__name__': '__main__', '__doc__': None, 
        # '__package__': None, '__loader__': 
        # <_frozen_importlib_external.SourceFileLoader object at 0x00000150A1ECFEF0>,
        #  '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__':
        #  'E:/python全栈15期/day11/code/04 名称空间.py', '__cached__': None, 
        # 'a': 110, 'fn': <function fn at 0x00000150A1E8C1E0>} >>>(a在全局中,fn也在全局中)

        print(locals())  # 查看当前作用域中的内容  >>> 当前层次局部作用域没有内容,所以返回一个{}
    gn()
fn()  #先调用 函数 fn 再定义函数gn,再调用函数gn

函数嵌套

函数可以互相的嵌套

a = 1         # 01
def fun_1():   #03
    a = 2         # 05
    def fun_2(): #07
        global a
        a = 3       #09
        def fun_3():   #11
            a = 4        #13
            print(a)     #14 
        print(a)    #10 >>>结果: 3
        fun_3()     # 12 >>>结果:函数fun_3最后是 4
        print(a)      #15>>> 结果 :  3
    print(a)       #06 >>>结果:2
    fun_2()       #08
    print(a)        #16 >>> 结果: 2
print(a)     #02   >>> 结果: 1
fun_1()      #04   >>>fun_1函数最终结果 2
print(a)      # 17 >>>  结果: 3
               #>>> 所以最终输出为 1,2,3,4,3,2,3

 

global和nonlocal关键

a = 30
def func():
    print(a)


func() >>> # 30
print(a) >>>#30

 

global: 在局部访问全局中的内容

a = 30
def func():
    global a  # 1. 可以把全局中的内容引入到函数内部 , 2. 在全局创建一个变量
    a = 20
    print(a) 


func() >>> # 结果: 20
print(a) >>>#结果: 20   global把全局那个变量a 修改了

nonlocal: 在局部寻找外层函数中离他最近的那个变量

a = 10
def outer():
    a = 40
    def inner(): # 在inner中改变a的值
        nonlocal a # 寻找外层函数中离他最近的那个变量,但不会找到全局那个变量
        print(a)    #  40
    inner()
outer()  >>> # 结果 40
print(a) >>> # 结果 10

 

posted @ 2018-08-09 16:37  张大仙er  阅读(312)  评论(0编辑  收藏  举报