细碎知识,在此记录
- 命名空间
命名空间:一个存放名字与值关系的空间,如a = 10
命名空间分类:
1.全局命名空间->我们直接在py文件中,函数外声明的变量都属于全局命名空间
2.局部命名空间->在函数中声明的变量会放在局部命名空间
3.内置命名空间->存放在python解释器为我们提供的名字,list,tuple,str,int等
加载顺序:
1.内置命名空间
2.全局命名空间
3.局部命名空间(函数被执行的时候)
取值顺序:就近原则:局部->全局->内置
-
作用域
全局作用域:内置+全局
局部作用域:局部
globals() 查看全局作用域的名字;返回的是一个字典(官方:以字典类型返回当前位置的全部全局变量。)
locals() 查看当前作用域的名字;返回的是一个字典(官方:以字典类型返回当前位置的全部局部变量。)
示例如下:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
def func():#在全局空间声明一个函数
a = 10 #a为局部空间
print(locals())#查看当前作用域,在这里为函数内部
func()#调用
print(globals())#查看全局
##结果: {'a': 10}
## {略,'func':<xxxxxx>}
b = 10
print(locals())
print(globals())
#你会发现他们打印的东西是一样的,所以要理解当前作用域!!!
- global与nonlocal
个人理解:global:把全局变量拿到局部来用(变量能被改变);nonlocal:把离它最近的一层的变量拿到局部来用,但是不会拿全局变量(变量能被改变)
global代码:
#例1
a = 0
def func():
return a #因为局部没a,拿的是全局变量a
print(a)#a = 0
print(func())#a = 0
#例2
a = 0 #全局命名空间;声明全局变量
def func(): #声明函数,没有执行
global a #global关键字用来在函数或其他局部作用域中使用全局变量
a +=1 #改变了全局变量a
return a
print(a)#输出0,因为先执行打印a,而a没有变
print(func())#输出1,调用并且执行了函数,a的值已经变了
nonlocal代码:
# 例3
def func():#声明func()
a = 0 #局部变量a
def func2():
nonlocal a #调用上一层的,局部的a
a +=1
return a
print("第一个函数里的a:%d" % a)#没有执行func2,a没有变
print("func2函数的返回值a:%d" % func2())#执行func2
print("最后a的值:%d" % a)#a已经变了
func()
#第一个函数里的a:0
#调用func2函数的返回值a:1
#最后a的值:1
欢迎交流,如有错误欢迎指正!