1.命名空间
1.1 内置命名空间--python解释器
就是python解释器一启动就可以使用的名字,存储在内置的命名空间中.
内置的名字在启动解释器的时候被加载进内存里.如print,input,list等.然后开始读代码,再加载代码中的名字(全局变量).
1.2 全局命名空间--代码,但不是在函数中的代码
是在程序从上到下被执行过程中依次被加载到内存的.
放置了我们设置的所有变量名和函数名.
1.3 局部命名空间--函数
就是函数内部定义的变量名字.
当调用函数的时候,才会产生这个名称空间,随着函数执行的结束,这个命名空间就会消失.
总结: 依赖倒置原则.
在局部可以使用全局,内置命名空间的名字.
在全局可以使用内置空间的名字,不可以使用局部空间中的名字.
在内置命名空间中不可以使用全局,局部空间中的名字.
多个函数拥有多个独立的局部命名空间,不互相共享.
当在全局定义了内置同名的名字时,会使用全局的名字.
当自己的空间有的这个名字的时候,就使用自己的名字.如果自己没有,就直接找上一级申请,上一级没有再找上一级,一直找到内置的命名空间.如果内置的命名空间也没有,就会报错.
2.作用域
2.1 全局作用域
作用在全局,内置和全局名字空间中的名字都属于全局作用域.
可以使用globals()查看.
2.2 局部作用域
作用在局部,函数(局部名字空间中名字属于局部作用域)
可以使用locals()查看.
如果在全局执行locals()会查看全局.跟执行时z所在的位置有关.
总结:
对于不可变数据类型,在局部可以查看全局作用域的变量,但是不能直接修改.
如果要修改,需要在程序中使用global声明.这个变量在局部的所有操作对全局的变量有效.
# nolocal 只能用于局部变量,找上一层中离当前层最近一层的局部变量.
3.函数的嵌套调用
4.函数的嵌套定义
5.函数名就是内存地址
# 函数名可以赋值
# 函数名可以作为容器类型的元素
# 函数名可以作为函数的参数
6.闭包
# 嵌套函数且内部函数要调用外部函数的变量.
变量a是inner函数外部的变量,inner函数调用是闭包.
"a"字符串是内部变量,所以不是闭包.
# 在外部函数使用内部函数的调用
举例:
重点: 函数的命名空间,作用域,嵌套调用.
公众号:偷学Python.