py12-函数命名空间-作用域

1、名称空间

  就是存放名字的地方,准确的说名称空间是存放的名字与变量值绑定关系的地方。

  示例:之前定义的变量x=1,1存放在内存中,那名字x存放在哪里?名称空间正是存放名字x与1绑定关系的地方。

2、名称空间分类

  分为三种:

    内置名称空间:python自带的,如print、if、len、在python解释器时产生,存放一些python内置的名字。

    全局名称空间:在执行文件时产生,存放文件级别定义的名字。放置位置:没有缩进或者不是内置的,不在函数内部定义的就是全局名称空间。

    局部名称空间:在执行文件的过程中,如果调用了函数,则会产生该函数的局部名称空间,用来存放函数内定义的名字,该名字在函数调用时生效,崽函数调用结束后失效。

3、名称空间顺序

  加载顺序:

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

  名字的查找顺序:

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

  在全局是无法看到局部的,在局部可以查看全局的。

4、示例

x=0
def f1():
    x=1
    def f2():
        x=2
        def f3():
            x=3
            print(x)
        f3()
    f2()
f1()

 5、作用域

  作用域即范围

6、作用域分类

  全局作用域:全局存活,全局有效 ,用globals()来表示

  局部作用域:临时存活,只在局部有效,局部内访问,用locals()来表示

  作用域关系是在函数定义阶段就已经固定的,与函数的调用位置无关。

7、查看局部作用域

def f1():
    x=1
    y=2
    def f2():
        pass
    print(locals())
f1()

结果如下:
{'y': 2, 'f2': <function f1.<locals>.f2 at 0x00000000006EE1E0>, 'x': 1}

 

 8、查看全局作用域

x=123
def f1():
    x=1
    y=2
    def f2():
        pass
    print(globals())
f1()

结果:在全局里面看只能看到全局的作用域

 

 9、global nonlocal 两个关键字

x=1
def f1():
    x=2
f1()
print(x)

(调用的全局的名称空间,局部的不会替换全局的,全局的是不可变类型)

 

   修改全局变量的值 global

x=1
def f1():
    global x
    x=2
f1()
print(x)

(声明x=2就是全局的名称空间)
l=[]
def f2():
    l.append('f2')
f2()
print(l)

#全局的可变类型,可以直接修改

 

 

x=0
def f1():
    x=1
    def f2():
        x=2
        def f3():
            global x
            x=3
        f3()
    f2()
f1()
print(x)

#指定x=3为全局的变量,一步到位

 

  nonlocal修改的是当前的上一层的内部函数,只在局部有效

def f1():
    x=1
    def f2():
        x=2
        def f3():
            nonlocal x
            x=3
        f3()
        print(x)
    f2()
f1()

 

posted @ 2017-08-04 10:12  sysgit  阅读(201)  评论(0编辑  收藏  举报