函数内部的函数只能在函数的内部调用,不能在函数的外部调用。app
def f1(): x=1 print('from f1') def f2(): print('from f2') print(x) #会进行报错: Traceback (most recent call last): File "F:/python学习/python自学/测试4.py", line 6, in <module> print(x) NameError: name 'x' is not defined Process finished with exit code 1
名称空间:在学习内存管理的时候,变量的建立其实就是在 内存中开辟了一个新的空间,用来存储变量,可是却没说过变量名的存储,其实变量在内存中有一快内存存储变量名与变量之间的绑定关系的空间,而这个空间称为名称空间。函数
内置名称空间:python解释器独有的。学习
内置名称空间:存放python解释器自带的名字,如,int,float,len等测试
生命周期:Python解释器启动的时候python自动开辟内置名称空间存放了这些python的内置方法,python解释器中止解释以后才会销毁#code
全局的名称空间对象
全局名称空间:除了内置和局部的名字外,都存放在全局名称空间,以下面代码中的x,func
生命周期
生命周期:全局须要本身定义, python文件执行以后才可能有全局名称空间,文件结束以后才会销毁内存
x = 1 #x 是全局变量 def func(): print(x) func()
局部名称空间作用域
局部名称空间:用于存放函数调用期间函数体产生的名字,以下面的代码的f2
生命周期:在文件执行的时候函数调用期间时生效,在函数执行结束后失效。
def f1(): def f2(): print('from f2') f2() f1() #输出: from f2
(执行)加载顺序
因为.py文件是由Python解释器打开的,所以必定是在Python解释器中的内置名称空间加载结束后,文件才开始打开,这个时候才会产生全局名称空间,但文件内有某一个函数被调用的时候,才会开始产生局部名称空间,所以名称空间的加载顺序为:
内置名称空间——>全局名称空间——>局部名称空间
查找顺序
因为名称空间是用来存放变量名与值之间的绑定关系的,因此但凡要查找名字,必定是从三者之一找到,查找顺序为:
从当前的所在位置开始查找,若是当前所在的位置为局部名称空间,则查找顺序为:
当前位置——>局部名称空间——>全局名称空间——>内置名称空间
x= 1 y =2 len = 100 def func(): y = 3 len = 1000 print(y) print(len) func() #输出: 3 1000
x = 1 def func(): print(x) x = 10 func() #输出: 10
做用域: 产生做用的范围,做用域关系仅适用不可变数据类型,不适用于可变数据类型
全局做用域
全局做用域:全局有效,全局存活, 全局+内置名称空间中的变量,全局做用域中的变量只能在全局中使用
x = 1 # x为全局名称空间 def func(): print(x) func() #输出: 1
全局做用域
局部做用域:局部有小,临时存储,只包含局部名称空间。 局部名称空间中的变量,局部做用域中的变量只能在局部中使用
def f1(): def f2(): def f3(): print(x) x = 2 f3() f2() f1() #输出: 2
x = 1 def f1(): print(x) def f2(): x = 2 f1() f2() #输出: 1
def f1(): def inner(): print('from inner') return inner f = f1() # 把局部定义的函数放在全局之中 def bar(): f() bar() #输出: from inner
qlobal关键字
将局部变量修改成全局做用域中的变量。
x = 1 def f1(): x = 2 def f2(): global x #修改x为全局变量 x = 3 f2() f1() print(x) # 输出: 3
nonlocal关键字
修改局部做用域的变量为上一层局部做用域中的变量。
x = 1 def f1(): x = 2 def f2(): nonlocal x x = 3 f2() print(x) f1() #输出: 3
关键点
在局部想要修改全局的可变类型,不须要任何声明,能够直接修改。
在局部若是想要修改全局的不可变类型,须要借助global声明,声明为全局变量,既能够直接修改。
lis = list() def f1(): lis.append(1) print(lis) f1() print(lis) #输出: [] [1]