1、什么是名称空间
名称空间是存放名字与值绑定关系的地方
要取到值必须通过名字才能找,而名字又在名称空间中存放着,所以我们在取值时首先是去名称空间中名字
找到了名字自然就拿到值的内存地址。。。。
2、名称空间分为三种:
1、内置名称空间:存放的python解释器自带的名字
生命周期:在解释器启动时产生,在解释器关闭时回收
2、全局名称空间:除了内置的与局部的之外名字都属于全局名称空间
生命周期:在程序文件执行时就立刻产生,在程序执行完毕后就回收
# 其中:x,y,foo,z都是全局名称空间中的名字
x=1
y=2
def foo():
x=1
y=2
foo()
if y > x:
z=3
3、局部名称空间:存放的是函数内部定义的名字
生命周期:在调用函数时临时生效,在函数结束后立刻回收
加载顺序:内置名称空间-》全局名称空间-》局部名称空间
加载名称空间的目的是为了将名字与值的绑定关系存放起来
而存的目的是为了取,也就是说,当我们在查找名字时,必然
是在三者之一找到
查找顺序:局部名称空间-》全局名称空间-》内置名称空间
基于当前所在的位置往后查找
# len=100
# print(len) # 站在全局查找
def foo():
# len=2222
print(len)
foo()
x=100
y=200
# 强调:函数的形参名属于局部名称空间
def foo(x,y):
print(x,y)
foo(1,2)
x=2222
def f1():
# x=1
def f2():
# x=2
print('from f2',x)
f2()
x=111
f1()
4、作用域
域指的是范围,作用域指的是作用范围
分为:
全局作用范围:包含内置名称空间与全局名称空间中的名字
特点:全局有效,全局存活
局部作用范围:包含的局部名称空间的名字
特点:局部有效,临时存活
x=1
def f1():
def f2():
def f3():
x=3
print(x)
f3()
f2()
f1()
###
def foo():
print(x)
foo()
了解:globals与locals
x=1111111111111111111111111111111111111
def foo():
y=2
print(locals())
print(globals()) # 返回的是全局作用域中的名字
print(dir(globals()['__builtins__'])) # 返回的是全局作用域中的名字
print(locals() is globals())
foo()
如何打破函数层级带来的访问限制,让我能够在任意位置都可以访问到一个内部函数
基于函数对象的概念将一个内部函数返回到全局使用,从而打破了函数的层级限制
(******)
函数的作用域关系是在函数定义阶段就已经固定死的,与函数的调用位置无关,
即在调用函数时一定要跑到定义函数的位置寻找作用域关系
x=111
def outter():
x=33333
def inner():
print('from inner',x)
# x=4444
return inner
f=outter() #f=指向outter.locals.inner
# f()
def foo():
x=222
f()
foo()
x=4444
global :在局部声明名字是来自于全局的
x=1
def func():
global x
x=2
func()
print(x)
x=[]
def func():
x.append(1)
func()
print(x)
nonlocal : 声明变量是来自于当前层外层的(必须是在函数内的)
x=222
def f1():
x=111
def f2():
global x
x=0
f2()
print('f1---》',x)
f1()
print(x)
#############
x=222
def f1():
x=111
def f2():
nonlocal x
x=0
f2()
print('f1---》',x)
f1()
print('global===》',x)
函数对象、函数嵌套、名称空间与作用域、装饰器
链接:http://www.cnblogs.com/linhaifeng/articles/7532497.html