首页 > 其他 > 详细

[名称空间与作用域]

时间:2021-03-29 17:44:35      阅读:21      评论:0      收藏:0      [点我收藏+]

[名称空间与作用域]

名称空间 namespacs:存放名字与其对应的内存地址的地方

有了名称空间之后,就可以在栈区中存放相同的名字,详细的名称空间:↓

一、名称空间分为三大类:

1、内置名称空间

? 存放的名字:内置名称空间存放的是python解释器自带的名字

? 例如:print input ....

? 生命周期:py解释器启动则产生,解释器关闭则销毁

2、全局名称空间

? 存放的名字:只要不是内置的和函数内定义的名字,都是全局名称空间

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

3、局部名称空间

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

? 生命周期 :在调用函数时产生,函数调用结束后销毁

4、名称空间的加载顺序

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

5、名称空间的销毁顺序

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

6、名称空间查找优先级:从当前所在位置一层一层查找

? 内置名称空间

? 全局名称空间

? 局部名称空间

6.1如果当前在局部名称空间↓
# 局部名称空间>>>全局名称空间>>内置名称空间

# input = 333   全局找到打印 333 ,全局注释掉则去内置找
# def func():
    # input = 444  #先在局部找,局部注释掉没有之后去全局↑找
    # print(input)
# func()

6.2 如果当前在全局名称空间
#全局名称空间>>内置名称空间
# .....
示范1:
# def func():
#     print(x)
# x = 111
# func()

# input = 333
# def func():
#     print(input)
# func()
示范2:名称空间的“嵌套”关系 是以函数定义阶段为准的,与调用位置无关
# input = 111
# def f1():
#     # input = 222
#     def f2():
#         # input=333
#         print(input)
#     input = 222
#     f2()
# f1()
# 名称空间的查找顺序是以定义阶段为准的
# 名称空间的查找顺序是以定义阶段为准的
# 名称空间的查找顺序是以定义阶段为准的
# 名称空间的查找顺序是以定义阶段为准的
# 名称空间的查找顺序是以定义阶段为准的
# 名称空间的查找顺序是以定义阶段为准的

# x = 111
# def func():
#     print(x)
#     x = 222
# func()

二、作用域-->> 作用范围

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

? 1、全局存活

? 2、全局有效

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

? 1、临时存活

? 2、局部有效:在函数内有效

LEGB

# L:当前位置
# E:外层函数
# G:全局
# B:内置

# 基于当前所在位置向外一层一层查找 L--> E--> G--> B
#  LEGB
#  builtin
#  global
#def f(x):
        #enclosing
#     def f1():
            #enclosing
#         def f2():
            #local
#             print(x)

如果在局部想要修改全局的名字对应的值(不可变类型) 需要用 global

# x= 111
# def func():
#     global x   # global申明x这个名字是全局的名字,不要再造新的名字
#     x = 222
# func()
# print(x)


# 示范
# l = [111,222]
# def func():
#     l.append(333)  #追加值
# func()
# print(l)


# nonlocal(了解) 修改函数外层函数包含的名字对应的值(不可变类型)
# x = 0
# def f1():
#     x=1
#     def f2():
#         nonlocal x
#         x=2
#     f2()
#     print(x)
# f1()


# global
# x = 111
# def func():
#     global x
#     x = 222
# func()
# print(x)

[名称空间与作用域]

原文:https://www.cnblogs.com/liupengfei1123/p/14592684.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!