1. 作用域
Python的作用域可以分为四种:
L (Local) 局部作用域
E (Enclosing) 闭包函数外的函数中
G (Global) 全局作用域
B (Built-in) 内建作用域
变量/函数 的查找顺序:L –> E –> G –>B
意思是,在局部找不到的,便去局部外的局部作用域找(例如 闭包),再找不到的就去全局作业域里找,再找不到就去内建作业域中找。
会影响 变量/函数 作用范围的有
函数:def 或 lambda
类:class
关键字:global noglobal
文件:*py
推导式:[],{},()等,仅限Py3.x中,Py2.x会出现变量泄露。
1、赋值在前,引用在后
2、引用在前,赋值在后(同一作用域内)
3、赋值在低层,引用在高层
好像并不难理解,为什么初学者会觉得闭包难以理解呢?
我解释一下,你就明白了。
一般情况下,在我们认知当中,如果一个函数结束,函数的内部所有东西都会释放掉,还给内存,局部变量都会消失。但是闭包是一种特殊情况,如果外函数在结束的时候发现有自己的临时变量将来会在内部函数中用到,就把这个临时变量绑定给了内部函数,然后自己再结束。
你可以看下面这段代码,就构成了闭包。在内函数里可以引用外函数的变量。
Python作为一门不断发展与普及的语言,还在不断更新中。在学习时,建议找一些学习伙伴一起来学习和讨论,效果更佳。如果想学习Python,欢迎加入Python学习交流群(627012464),一起督促,一起学习。里面有开发工具,很多干货和技术资料分享!
3. 改变作用域
变量的作用域,与其定义(或赋值)的位置有关,但不是绝对相关。因为我们可以在某种程度上去改变向上的作用范围。
关键字:global将 局部变量 变为全局变量
关键字:nonlocal可以在闭包函数中,引用并使用闭包外部函数的变量(非全局的噢)
global好理解,这里只讲下nonlocal。
先来看个例子
运行一下,会报错。
但是这样就OK
其实,你如果不使用 +=、-=等一类的操作,不加nonlocal也没有关系。这就展示了闭包的特性。
4. 变量集合
在Python中,有两个内建函数,你可能用不到,但是需要知道
globals() :以dict的方式存储所有全局变量
locals():以dict的方式存储所有局部变量
globals()
locals()