全局变量定义:
在函数外部定义的变量。所有函数内部都可以使用这个变量。
局部变量定义:
在函数内部定义的变量。这个变量只能在定义这个变量的函数内部使用。
第一种:global定义全局变量在自定义函数内部
定义看起来一愣一愣的,没关系我也是。我将会用实例的方式为你解释。我们也知道在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)
******最后的到运行结果如下******
结论:上面例子说明了 global 定义 全局变量,就是用在 自定义函数 内部,用于告诉python这是一个 全局变量 .作用跟在 全局作用域 里写下一个 全局变量a 是一样一样的效果
(注意,我可没在全局定义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()函数以后,这个变量便消失,不可再用。同时也体现了“局部变量>全局变量”的优先级关系。
结论:在全局 定义 全局变量 key 后,自定义函数 内部 再对这个 key 进行定义 的时候,就是定义了 key局部变量,出了这个 自定义函数,便不可再用。下一个自定义函数 只能用 全局变量key 了。
**********************分割线***************************
第三种:前两种的混用
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一点,但本质都是一群小趴菜,微不足道,轻轻松松好吧...
为什么要有global?
你想想啊,如果函数内部的局部变量不能改变全局变量肯定是不行的吧,因为总会有情况需要的..
so,这时候global就来了.他的作用是什么呢?是为了告诉python解释器说,我在自定义函数内部global a,相当于在全局作用域里面写一个全局变量a...因此呢,不就可以实现在自定义函数内部也可以改变全局变量的作用啦吗?
兄弟们,好好看看我新更新的内容,你一定受益匪浅!!!!!!!!!!文章来源:https://www.toymoban.com/news/detail-453482.html
(如有不足或错误,敬请指正)文章来源地址https://www.toymoban.com/news/detail-453482.html
到了这里,关于Python全局变量和局部变量(超详细,纯干货,保姆级教学)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!