名称空间与作用域

一、名称空间namespacs:存放名字的地方,是对栈区的划分

名称空间即存放名字与对象映射/绑定关系的地方。

1.分为三类:内置名称空间、全局名称空间、局部名称空间

1.1 内置名称空间

(1)存放的名字:存放的python解释器内置的名字。

>>> print

<built-in function print>

>>> input

<built-in function input>

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

1.2 全局名称空间

(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 局部名称空间

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

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

 def func(a,b):

    pass

 func(10,1)

 func(11,12)

 1.4 名称空间的加载顺序

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

 1.5 销毁顺序

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

 1.6 名字的查找优先级:当前所在的位置向上一层一层查找

(1)如果当前在局部名称空间:

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

(2)如果当前在全局名称空间

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

二:作用域-》作用范围

1、全局作用域:内置名称空间、全局名称空间

(1)全局存活

(2)全局有效:被所有函数共享

2、局部作用域: 局部名称空间的名字

(1)临时存活

(2)局部有效:函数内有效

3、global的使用

如果在局部名称空间想要修改全局名称空间的名字对应的值,针对不可变类型需要用global

global x # 声明x这个名字是全局的名字,不要再造新的名字了

x=222

针对可变类型:不需使用global便可实现修改

l=[111,222]

def func():

    l.append(333)

func()

print(l)    # [111, 222, 333]

4、nonlocal(了解): 修改函数外层函数包含的名字对应的值,针对不可变类型需要用nonlocal

 x=0

 def f1():

     x=11

     def f2():

         nonlocal x

         x=22

     f2()

     print('f1内的x:',x)

 f1()   #f1内的x: 22

针对可变类型:不需使用nonlocal便可实现修改

 def f1():

     x=[]

     def f2():

        x.append(1111)

     f2()

     print('f1内的x:',x)

 f1()    # f1内的x: [1111]

posted @ 2020-03-19 19:55  多啦a梦与时光机  阅读(116)  评论(0编辑  收藏  举报