第十天函数进阶

---恢复内容开始---

一 命名空间:

  全局命名空间:在定义函数和变量的时候会生成一个全局命名空间,在程序从上到下被执行的过程中被一次加载进内存。

    例如:我们曾经定义过的函数名或变量名称。

  局部命名空间:就是函数内部定义的名称。在函数调用过程中才会被放到内存中

  内置命名空间: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不是一个全局变量,但是这个变量是会始终存在于内存中的。这个变量不会影响全局变量,又可以随时使用。

    目前应该还没有需求点,但是以后对于程序的优化作用是很大的。

猜你喜欢

转载自www.cnblogs.com/wanghanyao/p/10171926.html