python 命名空间与作用域 可变与不可变对象 闭包
-
作用域规则顺序为: L->E->G->B 如果变量在局部内找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再找不到就去内置中找。
-
若要在函数内使用global variable,则要么使用global声明,要么通过函数参数传递。
-
Python 中只有模块(module),类(class)以及函数(def、lambda)才会引入新的作用域,其它的代码块(如 if/elif/else/、try/except、for/while等)是不会引入新的作用域的。
-
相对于nonlocal,global 关键字可以用在任何地方,包括最上层函数中和嵌套函数中,即使之前未定义该变量,global 修饰后也可以直接使用,而 nonlocal 关键字只能用于嵌套函数中,并且外层函数中定义了相应的局部变量,否则会发生错误。函数内global声明未定义的变量x,只要函数中对x符值了,则x就成为了一个全局变量,可以在后续程序中使用。(nonlocal无此特性,见下图:不能通过nonlocal声明一个未定义的量,即使在nonlocal空间/下方标黄的部分/声明一个全局,也不能通过nonlocal关联这个变量a)
对于可变对象类型,地址不固定,而是创建一个可变对象时,找到一个地址,作为这个对象实例。所以相同值的两个对象也是不同地址的两个对象,也因此,对对象如列表进行操作,不会影响这个列表的地址,只会对地址扩充。而不可变数据类型:变量所指向的内存地址处的值是不可以被改变。 因此对于两个相同值的对象,他们指针都指向同一个地址。
闭包:在一些语言中,在函数中可以(嵌套)定义另一个函数时,如果内部的函数引用了外部的函数的变量,则可能产生闭包。闭包可以用来在一个函数与一组“私有”变量之间创建关联关系。在给定函数被多次调用的过程中,这些私有变量能够保持其持久性。
闭包作用就是:
- 作用1:闭包是将外层函数内的局部变量和外层函数的外部连接起来的一座桥梁。(并且能保证全局命名空间不被污染)
- 作用2:将外层函数的变量持久地保存在内存中。(这一步是因为调用闭包函数的父函数时,会返回闭包函数,如果这个返回被赋值到一个全局变量,则由于闭包函数的存在依赖于父函数中的nonlocal变量,导致父函数不会在调用后被垃圾回收机制(garbage collection)回收)
ref:
python 命名空间和作用域详解 - 知乎
闭包,看这一篇就够了——带你看透闭包的本质,百发百中-CSDN博客
【Python面试】 说说Python可变与不可变数据类型?-腾讯云开发者社区-腾讯云
Python闭包(Closure)详解 - 知乎
闭包,看这一篇就够了——带你看透闭包的本质,百发百中-CSDN博客