第十天函数进阶
---恢复内容开始---
一 命名空间:
全局命名空间:在定义函数和变量的时候会生成一个全局命名空间,在程序从上到下被执行的过程中被一次加载进内存。
例如:我们曾经定义过的函数名或变量名称。
局部命名空间:就是函数内部定义的名称。在函数调用过程中才会被放到内存中
内置命名空间:python解释器启动时就存在于内存中的空间。
例如:print() list() input() 等都有内置的命名空间。
在局部:可以使用全局和内置命名空间
在全局:可以使用内置命名空间和全局命名空间的变量
即在大空间不能使用小空间里的变量,但是在小空间里可以使用大空间里的变量。
在内置的命名空间里,是不能使用全局和全局变量的。
另外注意:如果定义了和内置函数的自定义函数,自定义函数会覆盖内置函数。
多个局部空间之间各自的变量是不共享的。
二 作用域:
全局作用域:作用在全局,包含全局和内置命名空间中的名字。
局部作用域:作用在局部,包含函数内的名字。
注意,对于不可变类型,在局部可以查看全局变量,但是不能直接修改。如果想要修改的话,需要使用global声名。
但是尽量不要使用global 声名,尽量使用传参和接受参数去在局部和全局中传递参数。
a = 1
def adda():
global a
a += 1
print(a)
adda()
>>> 2
以上代码意味着,函数使用的是全局变量,而不是函数内的局部变量。
locals() :用于查看全部的局部变量。
globals() :用于查看全部的全局变量,甚至包含在局部中的变量。
注意,函数产生的作用域是在定义函数的位置产生的,而不是在定义函数的位置产生的。
所以,即使函数是在内部空间定义,而在全局空间调用,这个函数使用的还是内部嵌套的局部空间变量,而不是全局空间变量。
三 闭包
在外部函数定义了变量,在内部函数中调用了外部函数的变量,就以意味着这个内部函数就是一个闭包函数。
如果print(函数名.__closure)如果打印了一个cell的结果,那么这个函数就是一个闭包。
标准格式:
def outer():
a = 1
def inner():
print(a)
return inner
inn = outer()
inn()
意义:这个时候,虽然a不是一个全局变量,但是这个变量是会始终存在于内存中的。这个变量不会影响全局变量,又可以随时使用。
目前应该还没有需求点,但是以后对于程序的优化作用是很大的。