Python全局变量和局部变量(超详细,纯干货,保姆级教学)

您所在的位置:网站首页 蛇喜欢爬树吗 Python全局变量和局部变量(超详细,纯干货,保姆级教学)

Python全局变量和局部变量(超详细,纯干货,保姆级教学)

2024-06-21 05:25| 来源: 网络整理| 查看: 265

全局变量定义:

                        在函数外部定义的变量。所有函数内部都可以使用这个变量。

局部变量定义:

                        在函数内部定义的变量。这个变量只能在定义这个变量的函数内部使用。

第一种: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 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...因此呢,不就可以实现在自定义函数内部也可以改变全局变量的作用啦吗?

兄弟们,好好看看我新更新的内容,你一定受益匪浅!!!!!!!!!!

(如有不足或错误,敬请指正)



【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3