Python学习心得第四周-03 名称空间与作用域


1、什么是名称空间
名称空间是存放名字与值绑定关系的地方

要取到值必须通过名字才能找,而名字又在名称空间中存放着,所以我们在取值时首先是去名称空间中名字
找到了名字自然就拿到值的内存地址。。。。

2、名称空间分为三种:
1、内置名称空间:存放的python解释器自带的名字
生命周期:在解释器启动时产生,在解释器关闭时回收

2、全局名称空间:除了内置的与局部的之外名字都属于全局名称空间
生命周期:在程序文件执行时就立刻产生,在程序执行完毕后就回收
#            其中:x,y,foo,z都是全局名称空间中的名字
            x=1
            y=2

            def foo():
                x=1
                y=2

            foo()


            if y > x:
                z=3
    3、局部名称空间:存放的是函数内部定义的名字
生命周期:在调用函数时临时生效,在函数结束后立刻回收


加载顺序:内置名称空间-》全局名称空间-》局部名称空间
加载名称空间的目的是为了将名字与值的绑定关系存放起来
而存的目的是为了取,也就是说,当我们在查找名字时,必然
是在三者之一找到

查找顺序:局部名称空间-》全局名称空间-》内置名称空间
基于当前所在的位置往后查找
# len=100
# print(len) # 站在全局查找

def foo():
    # len=2222
    print(len)
foo()


x=100
y=200
# 强调:函数的形参名属于局部名称空间
def foo(x,y):
    print(x,y)

foo(1,2)

x=2222
def f1():
    # x=1
    def f2():
        # x=2
        print('from f2',x)
    f2()

x=111
f1()
    4、作用域
域指的是范围,作用域指的是作用范围
分为:
全局作用范围:包含内置名称空间与全局名称空间中的名字
特点:全局有效,全局存活
局部作用范围:包含的局部名称空间的名字
特点:局部有效,临时存活
x=1

def f1():
    def f2():
        def f3():
            x=3
            print(x)
        f3()
    f2()

f1()

###
def foo():
    print(x)

foo()

了解:globals与locals
x=1111111111111111111111111111111111111

def foo():
    y=2
    print(locals())

print(globals()) # 返回的是全局作用域中的名字
print(dir(globals()['__builtins__'])) # 返回的是全局作用域中的名字

print(locals() is globals())

foo()

  


如何打破函数层级带来的访问限制,让我能够在任意位置都可以访问到一个内部函数
基于函数对象的概念将一个内部函数返回到全局使用,从而打破了函数的层级限制

(******)
函数的作用域关系是在函数定义阶段就已经固定死的,与函数的调用位置无关,
即在调用函数时一定要跑到定义函数的位置寻找作用域关系
x=111
def outter():
    x=33333
    def inner():
        print('from inner',x)
        # x=4444
    return inner

f=outter() #f=指向outter.locals.inner
# f()

def foo():
    x=222
    f()

foo()
x=4444
global :在局部声明名字是来自于全局的
x=1

def func():
    global x
    x=2

func()
print(x)


x=[]
def func():
    x.append(1)

func()
print(x)
nonlocal : 声明变量是来自于当前层外层的(必须是在函数内的)
x=222
def f1():
    x=111
    def f2():
        global x
        x=0

    f2()
    print('f1---》',x)

f1()
print(x)

#############
x=222
def f1():
    x=111
    def f2():
        nonlocal x
        x=0

    f2()
    print('f1---》',x)

f1()
print('global===》',x)

  

函数对象、函数嵌套、名称空间与作用域、装饰器

链接:http://www.cnblogs.com/linhaifeng/articles/7532497.html


posted @ 2018-07-17 16:29  天天吃饭团  阅读(110)  评论(0编辑  收藏  举报