命名空间:来描述一个变量的动作。命名空间是一个字典(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的变量就没有定义,解释器就给我们返回报错
a =10 #a变量属于全局命名
def fun():
a =10
print(a)
fun()
def fun():
a =10 a =10 #a变量属于局部命名
print(a)
fun()
当我们写代码要使用变量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() 查看局部作?用域中的变量量和函数信息
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
原文:https://www.cnblogs.com/gxj521test/p/13599470.html