python怎么声明全局变量,python声明全局变量
外部功能和内部功能
如果在一个函数内部定义了另一个函数,我们称之为外部函数和内部函数。
关闭:
内部函数是在外部函数中定义的。外层函数的临时变量用在内层函数中,外层函数的返回值是内层函数的引用。这构成了一个终结。
一般在我们的认知中,如果一个函数结束,函数内部的东西都会被释放并返回内存,局部变量就会消失。然而,闭包是一个特例。如果外部函数发现它有自己的临时变量,将来会在内部函数中使用,它将这个临时变量绑定到内部函数,然后结束自己。
例:count()是外部函数,choose()是内部函数,内部函数引用外部变量base,外部函数返回内部函数的引用,所以choose是闭包。匿名函数lambda sales: sales base 10000实现了同样的功能(Python中一切都是对象)def count(base):# return lambda sales:sales * base * 10000 def choose(sales):return sales * 10000 * base return choose count 1=count(0.01)count 2=count(0.02)count 3=count(0.03)def make sales(sales):if(sales=20):return count 3(sales)elif(sales=10):return count 2(sales)else
引用的是什么?在python中,一切都是对象,包括整数数据1,函数,其实都是对象。
当我们做a=1时,实际上是把值1存放在内存的某个地方,然后用变量名A存放1所在内存位置的引用。引用就像C语言中的指针。你可以把引用理解为地址。a只是一个变量的名字。值1的地址存储在A中,即值1的引用存储在A中。
同理,当我们定义一个函数def demo():在python中,内存中会有一些空间用来存储这个函数的代码,内部的局部变量等等。这个演示只是一个变量名,引用了这个函数的位置。我们也可以做x=demo,y=demo,相当于把demo里面存储的东西赋给x和y,这样x和y都指向demo函数所在的引用。之后我们可以用x()或者y()调用自己的demo(),其实根本就是一个函数。x,y,demo这三个变量名的作用是一样的。一个函数,如果函数名后面有一对括号,就相当于现在调用这个函数。如果它后面没有括号,它就相当于一个函数的名字,其中存储了对函数位置的引用。外部函数将临时变量绑定到内部函数:
按照我们正常的认知,当一个函数结束的时候,会把它所有的临时变量释放回内存,然后变量就不存在了。一般来说,这是真的。但是闭包是一个特例。外部函数发现它的临时变量将在未来的内部函数中使用。当它完成时,它会将外部函数的临时变量发送给内部函数,并将它们绑定在一起。所以外层函数已经结束了,调用内层函数的时候仍然可以使用外层函数的临时变量。闭包中的内部函数修改外部函数的局部变量;
在闭包的内部函数中,我们可以随意使用外部函数绑定的临时变量,但是如果要修改外部函数临时变量的值,就发现不对了!
在python的基本语法中,一个函数可以随意读取全局数据,但是修改全局数据有两种方法:1 global声明全局变量;2全局变量是可变数据时可以修改。
闭包内的函数也是如此。当您想要修改内部函数中的闭包变量(由外部函数绑定到内部函数的局部变量)时:
在python3中,你可以用nonlocal关键字声明一个变量,这意味着这个变量不是局部变量空间中的变量,你需要在上层变量空间中找到这个变量。
在python2中,没有关键字nonlocal,所以我们可以将闭包变量改为变量类型数据进行修改,比如list。
在使用闭包的过程中,一旦调用一次外部函数,返回内部函数的引用,虽然每次调用内部函数都会打开一个函数,然后死亡,但实际上只有一个闭包变量。每次打开内部函数时,都会使用相同的闭包变量。封闭有什么用?
3.1装修工!装修工是做什么的?其中一个应用是我们在工作中写了一个登录函数,我们想统计一下执行这个函数用了多长时间。我们可以用一个装饰器来装饰这个登录模块,这有助于我们在执行登录函数之前和之后的时间。
3.2面向对象!经过上面的分析,我们发现外层函数的临时变量都给了内层函数。我们来回忆一下类对象的情况。对象有很多相似的属性和方法,所以我们创建类,类创建的对象都有相同的属性和方法。闭包也是实现面向对象的方法之一。虽然我们在python中不用,但是在avaScript等其他编程语言中,闭包经常被用来实现面向对象编程。
3.3实现单体模式!其实这也是decorator的应用。简单盈利模式毕竟比较高大上,需要一些项目经验才能明白简单盈利模式是干什么用的,就不讨论了。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。