名称空间就是存放名字(变量名或者函数名等)与对象映射/绑定关系的地方。例如x = 3,python会将内存空间存放对象3,然后将名字x与3的绑定关系存放于名称空间,del x 表示清除该绑定关系。
如果你想访问一个变量值,必须先访问对应的名称空间,拿到名字和对应的内存地址的绑定关系
内置名称空间
python提前定义过的名字,比如内置的函数名,就是存在于内置名称空间,
生命周期:python解释器启动的时候生效,解释器关闭的时候失效
全局名称空间
py文件执行过程中产生的名字都会存放于全局名称空间,是第二个被加载的名称空间,例如if,while,for内部定义的名字执行之后也会存放于全局名称空间。
生命周期:当启动当前py文件时全局名称生效,当前页面代码执行结束就会失效。
例如:以下名称都是全局名称空间
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
局部名称空间
函数内部定义的所有的名字都是存放于当前函数的局部名称空间
生命周期:当你调用函数时生效,函数体最后一行代码执行结束时失效
def foo(x):
y=3 #调用函数时,才会执行函数代码,名字x和y都存放于该函数的局部名称空间中
名称空间的加载顺序
内置名称空间--->全局名称空间--->局部名称空间
查找顺序
局部名称空间--->全局名称空间--->内置名称空间
在局部作用域查找名字时,起始位置是局部作用域,所以先查找局部名称空间,没有找到,再去全局作用域查找:先查找全局名称空间,没有找到,再查找内置名称空间,最后都没有找到就会抛出异常
在全局作用域查找名字时,起始位置便是全局作用域,所以先查找全局名称空间,没有找到,再查找内置名称空间,最后都没有找到就会抛出异常
全局作用域:位于全局名称空间、内置名称空间中的名字属于全局范围,该范围内的名字全局存活(除非被删除,否则在整个文件执行过程中存活)、全局有效(在任意位置都可以使用);
局部作用域:位于局部名称空间中的名字属于局部范围。该范围内的名字临时存活(即在函数调用时临时生成,函数调用结束后就释放)、局部有效(只能在函数内使用)。
只有可变类型可以在局部修改外部变量的值
注意:可以调用内建函数locals()和globals()来分别查看局部作用域和全局作用域的名字,查看的结果都是字典格式。在全局作用域查看到的locals()的结果等于globals()
global:可以声明全局变量(将局部变量改为全局变量)
在函数内,无论嵌套多少层,都可以查看到全局作用域的名字,若要在函数内修改全局名称空间中名字的值,当值为不可变类型时,则需要用到global关键字 , 当实参的值为可变类型时,函数体内对该值的修改将直接反应到原值,
原文:https://www.cnblogs.com/jiangxianseng/p/11837011.html