全局變量定義:
????????????????????????在函數(shù)外部定義的變量。所有函數(shù)內(nèi)部都可以使用這個(gè)變量。
局部變量定義:
????????????????????????在函數(shù)內(nèi)部定義的變量。這個(gè)變量只能在定義這個(gè)變量的函數(shù)內(nèi)部使用。
第一種:global定義全局變量在自定義函數(shù)內(nèi)部
定義看起來一愣一愣的,沒關(guān)系我也是。我將會用實(shí)例的方式為你解釋。我們也知道在Python中有一個(gè)global關(guān)鍵字用來聲明一個(gè)全局變量。那這玩意兒到底什么用。來看看
def first():
global key
key="first()的key"
print("進(jìn)入first函數(shù),給key賦新值,此時(shí)print(key)得到***"+key+"***\n")
def second():
print("進(jìn)入second函數(shù),但是沒有給key賦新值,此時(shí)print(key)得到***"+key+"***\n")
def third():
key="third()的key"
print("進(jìn)入third函數(shù),給key賦新值,此時(shí)print(key)得到***"+key+"***\n")
first()
second()
third()
print(key)
******最后的到運(yùn)行結(jié)果如下******
結(jié)論:上面例子說明了 global 定義 全局變量,就是用在? 自定義函數(shù)? 內(nèi)部,用于告訴python這是一個(gè)? 全局變量? .作用跟在? 全局作用域? 里寫下一個(gè)? 全局變量a? 是一樣一樣的效果
(注意,我可沒在全局定義key,但是可以打印出來,這說明了什么???嚴(yán)格證明了結(jié)論嘛)
? ? ? ? ? ? ? ? ?**********************分割線***************************
第二種:全局定義全局變量,并給其賦值。
(注:在全局內(nèi)寫“key="值"相當(dāng)于在全局內(nèi)寫“global key
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?key="值"”)
key="全局內(nèi)定義,并賦值的全局變量key"
def first():
key="first()局部新定義的“全局key“"
print("進(jìn)入first函數(shù),key的值為***"+key+"***\n")
def second():
print("進(jìn)入second函數(shù),在second函數(shù)內(nèi)部,不賦給key新值,引用first()函數(shù)后的key為***"+key+"***\n")
print("沒有引用first()函數(shù)時(shí)的key為***"+key+"***\n")#為了先print出key的全局內(nèi)定義的 全局變量值
first()#first()函數(shù)內(nèi)部對全局內(nèi)定義的 全局變量key 進(jìn)行了賦值。實(shí)質(zhì)上是在first()內(nèi)部定義了一個(gè)局部變量
second()#驗(yàn)證這個(gè) first()內(nèi)部定義的局部變量會不會影響到second()中的key。(就像第一種global key那樣。結(jié)論當(dāng)然是否定的。但我們這里驗(yàn)證一下,消除一下讀者的疑問)
print("引用first()函數(shù)后的key為***"+key+"***\n")#驗(yàn)證在 first()定義了一個(gè)局部變量之后,會不會影響到全局內(nèi)的全局變量key。(答案當(dāng)然也是否定的,這里這一步也是為了消除讀者的疑問)
********運(yùn)行結(jié)果如下********
?可見,以上例子中。first()內(nèi)定義了一個(gè)局部變量,然后出了這個(gè)first()函數(shù)以后,這個(gè)變量便消失,不可再用。同時(shí)也體現(xiàn)了“局部變量>全局變量”的優(yōu)先級關(guān)系。
結(jié)論:在全局 定義 全局變量 key 后,自定義函數(shù) 內(nèi)部 再對這個(gè)? key 進(jìn)行定義 的時(shí)候,就是定義了 key局部變量,出了這個(gè) 自定義函數(shù),便不可再用。下一個(gè)自定義函數(shù) 只能用 全局變量key 了。
? ? ? ? ? ? ? ? ?**********************分割線***************************
第三種:前兩種的混用
def first():
key="first()局部新定義的\"局部變量\"key"
print("進(jìn)入first函數(shù),key的值為***"+key+"***\n")
def second():
print("進(jìn)入second函數(shù),在second函數(shù)內(nèi)部,不賦給key新值,引用first()函數(shù)后的key為***"+key+"***\n")
def third():
global key
key="third()定義的全局通用(即全局變量)global key"
print("進(jìn)入third函數(shù),在third函數(shù)內(nèi)部,賦給key新值,且為global,引用third()后的key為***"+key+"***\n")
key="全局內(nèi)定義,并賦值的全局變量key"
print("沒有引用first()函數(shù)時(shí)的key為***"+key+"***\n")#與第二種的這個(gè)位置的作用一樣
first()#與第二種的這個(gè)位置的作用一樣
second()#與第二種的這個(gè)位置的作用一樣
third()#由于我們給third()內(nèi)部定義了一個(gè)global key,探測一下等下再調(diào)用third()的時(shí)候,我們的全局key會不會改變?yōu)閠hird()中的key值。即 第一種 的結(jié)論。(當(dāng)然哈,肯定是會的,證明見下一步)
print("引用third()函數(shù)后的,全局內(nèi)的key為***"+key+"***\n")#探測一下global key會不會影響 全局內(nèi)的key(答案是會影響,因?yàn)槲覀兊谝环N說過。在局部變量里面global key相當(dāng)于在全局作用域里直接寫一個(gè)key一樣的效果。)
********運(yùn)行結(jié)果如下********
OK,現(xiàn)在嚴(yán)格證明了結(jié)論一和結(jié)論二.
第四種.深入的了解一下.(必看!!!!!!!!!)
c語言大家都學(xué)過吧,沒學(xué)過也沒關(guān)系.你回想一下,我們寫的第一個(gè)hello world程序是不是下面這樣
#include<stdio.h>
int main()
{
printf("hello world");
}
注意到?jīng)]有,我們寫的第一個(gè)c語言程序就是在main()函數(shù)內(nèi)部寫的,根據(jù)定義,在函數(shù)內(nèi)部寫的就是局部變量,當(dāng)然main()函數(shù)也是函數(shù).
然而我們在python中寫的第一個(gè)hello world是
print("hello world")
這個(gè)python的hello world是在哪里寫的?沒錯(cuò),在全局作用域里面.而不是在函數(shù)內(nèi)部寫的.
根據(jù)上面的我說過的
局部變量與全局變量的理解方法
a=1
def good(): #定義一個(gè)good函數(shù),自定義函數(shù)內(nèi)部的是局部變量
a=2 #局部變量a=2
print(a) #print結(jié)果是2
good() #調(diào)用good()函數(shù)
print(a) #print結(jié)果是1
解釋:
? ??在全局作用域中定義了一個(gè)全局變量a并賦值為1
? ? 后來定義了一個(gè)good()函數(shù),作用是給局部變量賦值為2,并print這個(gè)a
? ? 然后調(diào)用這個(gè)good()函數(shù):
? ? ? ? ? ? ? 理解一下.這個(gè)名字為a的變量在good()函數(shù)中,變量a被自定義函數(shù)內(nèi)部的a=2給賦了一個(gè)新的值2,所以a的值由1變成了2.然后執(zhí)行了print()功能.最后這個(gè)函數(shù)是不是就調(diào)用完成了,然后python就把這個(gè)函數(shù)的局部變量(也就是a=2)的內(nèi)存釋放(其實(shí)也會將參數(shù)釋放掉,但是我這個(gè)函數(shù)沒有寫參數(shù))掉了...所以全局變量a的值又恢復(fù)為了1.(最好這樣理解,幫你記得更清晰一點(diǎn),你就按我這樣理解)
其實(shí)別總是死記硬背什么"在自定義函數(shù)內(nèi)部優(yōu)先級:局部變量>全局變量"這些全是二級結(jié)論,你要懂得本質(zhì).為什么在自定義函數(shù)內(nèi)部有這樣的優(yōu)先級?其實(shí)不就是因?yàn)槌绦蜻\(yùn)行到自定義函數(shù)內(nèi)部了,又遇到了同名的變量,然后給這個(gè)變量又賦了一個(gè)新值嘛..這和你在全局作用域內(nèi)見到
a=1
a=2
不是一樣的嘛...全局變量a先被賦值為了1,之后程序運(yùn)行到了第二行,遇到了同名的變量a,并給他賦了一個(gè)新值為2.這個(gè)邏輯其實(shí)和我上面紫色標(biāo)記的內(nèi)容一樣嘛.編程內(nèi)部邏輯不難,重要的是要理解..然后第二個(gè)二級結(jié)論就是.局部變量不可以改變?nèi)肿兞?,為什么?我接著上面紫色標(biāo)記的內(nèi)容繼續(xù)說,其實(shí)不就是因?yàn)?這個(gè)自定義函數(shù)調(diào)用完之后,他的局部變量被釋放掉了嘛.所以,局部變量影響不了全局變量.把上面藍(lán)色標(biāo)記的內(nèi)容好好看看,你品,你細(xì)品.全局變量,局部變量,聽著可高級是吧,其實(shí)就是名字聽著nb一點(diǎn),但本質(zhì)都是一群小趴菜,微不足道,輕輕松松好吧...
為什么要有g(shù)lobal?
你想想啊,如果函數(shù)內(nèi)部的局部變量不能改變?nèi)肿兞靠隙ㄊ遣恍械陌?因?yàn)榭倳星闆r需要的..
so,這時(shí)候global就來了.他的作用是什么呢?是為了告訴python解釋器說,我在自定義函數(shù)內(nèi)部global a,相當(dāng)于在全局作用域里面寫一個(gè)全局變量a...因此呢,不就可以實(shí)現(xiàn)在自定義函數(shù)內(nèi)部也可以改變?nèi)肿兞康淖饔美矄?
兄弟們,好好看看我新更新的內(nèi)容,你一定受益匪淺!!!!!!!!!!文章來源:http://www.zghlxwxcb.cn/news/detail-453482.html
(如有不足或錯(cuò)誤,敬請指正)文章來源地址http://www.zghlxwxcb.cn/news/detail-453482.html
到了這里,關(guān)于Python全局變量和局部變量(超詳細(xì),純干貨,保姆級教學(xué))的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!