名称空间和作用域

Posted wang-kai-1994

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了名称空间和作用域相关的知识,希望对你有一定的参考价值。

# 3.名称空间与作用域(重点知识)
#
# 一、名称空间(NameSpace)
#
# 1. 名称空间简介
#
# 前面讲变量的时候我们说过定义变量的过程都干了哪些事:
# 申请内存空间存放值,将内存空间的地址与变量名建立联系。
# 那么现在我们来思考一个问题,变量名被存到哪里去了?
#
# 首先我们可以肯定变量名是被存放到内存里面了。
# 当我们打开python解释器的时候,Python解释器就帮我们申请了一块内存空间,
# 专门用来存放变量名、函数名等这些东西。这块内存空间就叫做名称空间
#
# 说的稍微官方一点就是:
# 名称空间就是用来存放名字与值内存地址绑定关系的地方
#
# 2. 名称空间分类
#
# 名称空间分为三大类:
#
# 内置名称空间
#
# 内置名称空间是用来存放python内置关键字的地方,
# 在Python解释器运行的那一刻就已经定义好了,在python解释器关闭的时候就会自动清除
#
# 例如:print这种内置关键字就存放在内置名称空间中

# 1,全局名称空间

# 在python代码的顶级定义的名字就叫做全局名字
# (如果这个理解不了,可以换种方式理解,除了内置名称和局部名称,其他全是全局名称),
# 存放在全局名称空间,全局名称空间在python程序执行的时候定义,在python程序结束的时候自动清除
# 例如:
# a=1
# b=2
# name=‘egon‘
#
# 2,局部名称空间
#
# 在函数体内定义的名称就叫做局部名称,存放在局部名称空间,
# 函数的局部名称空间在调用函数时定义,在函数执行结束时自动清除.
# 例如:
# def foo():
# name=‘egon‘ # 局部名称空间
# 这里面的name就是在函数体内定义的,叫做局部名称,存放在局部名称空间。

# 3,关系

# 三种名称空间的产生的先后顺序: 内置->全局->局部
# 查找名字的顺序:从当前位置往外一层一层查找
# 如果当前在局部名称空间: 局部->全局->内置
# 如果当前在全局名称空间: 全局->内置

# 二、作用域
#
# 作用域就是指名称的作用范围
#
# 重点:作用域关系是在函数定义阶段就已经固定死了,与函数调用的位置没有关系!!!(重点重点重点)
#
# 对于全局名称来说:在全局定义的名称,在全局都可以使用
#
# 全局作用域可以访问到全局名称与内置名称但是不能访问到局部名称
# def foo():
# name=‘egon‘
# print(name) name ‘name‘ is not defined

# 这样就是试图在全局访问局部变量,会报错,说name这个变量没有被定义

# 对于局部名称来说:在局部定义的名称,只能在当前局部使用

# 局部作用域可以访问到该局部内的名称和全局名称以及内置名称

# def func():
# name=‘egon‘
# # 这是局部1
# def foo():
# pwd=‘123‘
# # 这是局部2
# print(name)
# 局部与局部是相互独立的,在局部2中访问局部1中的变量名是访问不到的

# 作用域重点实例:
# def func():
# name=‘egon‘
# print(name)
# name=‘alex‘
# func() #输出为egon
# 执行func函数,依旧会打印Catalog Spri,而不会打印alex,这就是我们前面所说的重点:
# 作用域在函数定义阶段就已经固定死了,和函数调用的位置没有关系










































































































以上是关于名称空间和作用域的主要内容,如果未能解决你的问题,请参考以下文章

函数参数函数嵌套作用域名称空间

作用域名称空间

Python3 函数基础2

Python/函数的嵌套和闭包

名称空间作用域闭包装饰器迭代器生成器

python-之名称空间与作用域闭包函数嵌套函数