赞
踩
在函数外部定义的变量。所有函数内部都可以使用这个变量。
在函数内部定义的变量。这个变量只能在定义这个变量的函数内部使用。
定义看起来一愣一愣的,没关系我也是。我将会用实例的方式为你解释。我们也知道在Python中有一个global关键字用来声明一个全局变量。那这玩意儿到底什么用。来看看
- def first():
- global key
- key="first()的key"
- print("进入first函数,给key赋新值,此时print(key)得到***"+key+"***\n")
- def second():
- print("进入second函数,但是没有给key赋新值,此时print(key)得到***"+key+"***\n")
- def third():
- key="third()的key"
- print("进入third函数,给key赋新值,此时print(key)得到***"+key+"***\n")
-
- first()
- second()
- third()
- print(key)
******最后的到运行结果如下******
(注意,我可没在全局定义key,但是可以打印出来,这说明了什么???严格证明了结论嘛)
(注:在全局内写“key="值"相当于在全局内写“global key
key="值"”)
- key="全局内定义,并赋值的全局变量key"
-
- def first():
- key="first()局部新定义的“全局key“"
- print("进入first函数,key的值为***"+key+"***\n")
- def second():
- print("进入second函数,在second函数内部,不赋给key新值,引用first()函数后的key为***"+key+"***\n")
-
-
- print("没有引用first()函数时的key为***"+key+"***\n")#为了先print出key的全局内定义的 全局变量值
-
- first()#first()函数内部对全局内定义的 全局变量key 进行了赋值。实质上是在first()内部定义了一个局部变量
-
- second()#验证这个 first()内部定义的局部变量会不会影响到second()中的key。(就像第一种global key那样。结论当然是否定的。但我们这里验证一下,消除一下读者的疑问)
-
- print("引用first()函数后的key为***"+key+"***\n")#验证在 first()定义了一个局部变量之后,会不会影响到全局内的全局变量key。(答案当然也是否定的,这里这一步也是为了消除读者的疑问)
********运行结果如下********
可见,以上例子中。first()内定义了一个局部变量,然后出了这个first()函数以后,这个变量便消失,不可再用。同时也体现了“局部变量>全局变量”的优先级关系。
- def first():
- key="first()局部新定义的\"局部变量\"key"
- print("进入first函数,key的值为***"+key+"***\n")
- def second():
- print("进入second函数,在second函数内部,不赋给key新值,引用first()函数后的key为***"+key+"***\n")
- def third():
- global key
- key="third()定义的全局通用(即全局变量)global key"
- print("进入third函数,在third函数内部,赋给key新值,且为global,引用third()后的key为***"+key+"***\n")
-
-
- key="全局内定义,并赋值的全局变量key"
- print("没有引用first()函数时的key为***"+key+"***\n")#与第二种的这个位置的作用一样
- first()#与第二种的这个位置的作用一样
- second()#与第二种的这个位置的作用一样
-
- third()#由于我们给third()内部定义了一个global key,探测一下等下再调用third()的时候,我们的全局key会不会改变为third()中的key值。即 第一种 的结论。(当然哈,肯定是会的,证明见下一步)
-
-
- print("引用third()函数后的,全局内的key为***"+key+"***\n")#探测一下global key会不会影响 全局内的key(答案是会影响,因为我们第一种说过。在局部变量里面global key相当于在全局作用域里直接写一个key一样的效果。)
********运行结果如下********
OK,现在严格证明了结论一和结论二.
c语言大家都学过吧,没学过也没关系.你回想一下,我们写的第一个hello world程序是不是下面这样
- #include<stdio.h>
- int main()
- {
- printf("hello world");
- }
注意到没有,我们写的第一个c语言程序就是在main()函数内部写的,根据定义,在函数内部写的就是局部变量,当然main()函数也是函数.
然而我们在python中写的第一个hello world是
print("hello world")
这个python的hello world是在哪里写的?没错,在全局作用域里面.而不是在函数内部写的.
根据上面的我说过的
-
- a=1
-
- def good(): #定义一个good函数,自定义函数内部的是局部变量
- a=2 #局部变量a=2
- print(a) #print结果是2
- good() #调用good()函数
- print(a) #print结果是1
解释:
在全局作用域中定义了一个全局变量a并赋值为1
后来定义了一个good()函数,作用是给局部变量赋值为2,并print这个a
然后调用这个good()函数:
理解一下.这个名字为a的变量在good()函数中,变量a被自定义函数内部的a=2给赋了一个新的值2,所以a的值由1变成了2.然后执行了print()功能.最后这个函数是不是就调用完成了,然后python就把这个函数的局部变量(也就是a=2)的内存释放(其实也会将参数释放掉,但是我这个函数没有写参数)掉了...所以全局变量a的值又恢复为了1.(最好这样理解,帮你记得更清晰一点,你就按我这样理解)
其实别总是死记硬背什么"在自定义函数内部优先级:局部变量>全局变量"这些全是二级结论,你要懂得本质.为什么在自定义函数内部有这样的优先级?其实不就是因为程序运行到自定义函数内部了,又遇到了同名的变量,然后给这个变量又赋了一个新值嘛..这和你在全局作用域内见到
- a=1
- a=2
不是一样的嘛...全局变量a先被赋值为了1,之后程序运行到了第二行,遇到了同名的变量a,并给他赋了一个新值为2.这个逻辑其实和我上面紫色标记的内容一样嘛.编程内部逻辑不难,重要的是要理解..然后第二个二级结论就是.局部变量不可以改变全局变量,,为什么?我接着上面紫色标记的内容继续说,其实不就是因为,这个自定义函数调用完之后,他的局部变量被释放掉了嘛.所以,局部变量影响不了全局变量.把上面蓝色标记的内容好好看看,你品,你细品.全局变量,局部变量,听着可高级是吧,其实就是名字听着nb一点,但本质都是一群小趴菜,微不足道,轻轻松松好吧...
你想想啊,如果函数内部的局部变量不能改变全局变量肯定是不行的吧,因为总会有情况需要的..
so,这时候global就来了.他的作用是什么呢?是为了告诉python解释器说,我在自定义函数内部global a,相当于在全局作用域里面写一个全局变量a...因此呢,不就可以实现在自定义函数内部也可以改变全局变量的作用啦吗?
兄弟们,好好看看我新更新的内容,你一定受益匪浅!!!!!!!!!!
(如有不足或错误,敬请指正)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。