python知识点@命名空间

python命名空间

命名空间:来描述一个变量的动作。命名空间是一个字典(dictionary),它的键就是变量名,它的值就是我们给变量赋值的值。

def fun():
    a =10
    print(a)
fun()
print(a)
输出:
10
Traceback (most recent call last):
  File "F:/VSA4.0/TestFrameWork(1)/zzytest/day1/demo12-1.py", line 5, in <module>
    print(a)
NameError: name 'a' is not defined

从上面我们可以知道在python解释器开始执行代码之后, 就会在内存中开辟一个fun函数的空间、a变量的空间, 每当遇到一个变量的时候, 就把变量名和值之间的关系记录下来, 这就是命名空间。

我们定义函数的时候, 解释器只是把函数名fun读入内存, 表示这个函数存在了, 至于函数内部的变量和逻辑, 解释器是不关心的. 也就是说一开始的时候函数只是加载进来, 仅此而已, 只有当函数被调用和访问的时候, 解释器才会根据函数内部声明的变量来进行开辟变量的内部空间. 随着函数执行完毕, 这些函数内部变量占用的空间也会随着函数执行完毕而被清空.所以我们a的变量就没有定义,解释器就给我们返回报错

命名空间分类:

  1. 全局命名空间—> 函数外声明的变量都属于全局命名空间
a =10 #a变量属于全局命名
def fun():
    a =10
    print(a)
fun()
  1. 局部命名空间—> 在函数中声明的变量会放在局部命名空间
def fun():
    a =10  a =10 #a变量属于局部命名
    print(a)
fun()
  1. 内置命名空间—> 存放python解释器为我们提供的名字, list, tuple, str, int这些都是内置命名空间

命名空间取值顺序:

当我们写代码要使用变量a的值时,Python会到所有可用的名字空间去查找变量,按照如下顺序:

a= 20
print(id(a))
def fun():
    a =10
    print(id(a))
    print(a)
fun()
print(a)
print(id(a))
输出:
1662936544
1662936384
10
20
1662936544

从上面我们可以分析到加自己的经验:

1、 局部命名空间:特指当前函数或类的方法。如果函数定义了一个局部变量 a,或一个参数 a,Python 将使用它,然后停止搜索。

2、 全局命名空间:特指当前的模块。如果模块定义了一个名为 a 的变量,函数或类,Python 将使用它然后停止搜索。

3、 内置命名空间:对每个模块都是全局的。作为最后的尝试,Python 将假设 a 是内置函数或变量。

4、 如果 Python 在这些名字空间找不到 a,它将放弃查找并引发一个 NameError 异常,如,NameError: name 'a' is not defined。

命名空间作用域:

作用域: 作用域就是使用变量数据的值的取值范围, 按照取值范围来看分为全局作用域和局部作用域

1、全局作用域: 包含内置命名空间和全局命名空间. 在整个文件的任何位置都可以使用(遵循 从上到下逐⾏执行)

2、局部作用域: 在函数内部可以使用

a= 20 #全局作用域
print(id(a))
def fun():
    a =10 #局部作用域
fun()

globals() 、locals() 函数的使用

globals() 查看全局作⽤用域中的内容
locals() 查看局部作⽤用域中的变量量和函数信息

a = 100
def func():
    a = 28
    print(a)
    print(globals())
    print(locals())
func()
#输出:
{'name': 'main', 'doc': None, 'package': None, 'loader':
<_frozen_importlib_external.SourceFileLoader object at 0x00000224FF94F8B0>
, 'spec': None, 'annotations': {}, 'builtins': <module 'builtins' (built-in)>,
'file': 'F:/studyPythonDemo/day01/demo01-1/demo01-7.py', 'cached':
None, 'a': 100, 'func': <function func at 0x00000224FFA97B80>}
{'a': 28}

从上代码我们可以看出 全局变量其他的输出是内置变量的值,'a': 100

posted @ 2020-09-01 23:30  进击的bug~  阅读(203)  评论(0编辑  收藏  举报