局部變量和全局變量的區(qū)別
- 全局變量在定義時(shí)沒有縮進(jìn)栅螟,局部變量在定義時(shí)有縮進(jìn)
- 全局變量在所有的位置都可以訪問荷辕,而局部變量只在定義它的函數(shù)體內(nèi)部訪問
- 全局變量是在函數(shù)外部聲明的變量,局部變量是在函數(shù)內(nèi)部聲明的變量
name='yang' #全局變量
def test():
s=2 #局部變量
print('我的名字',name) #先在子程序內(nèi)尋找name秒裕,如果沒有再?gòu)耐獠空襫ame
test()
運(yùn)行結(jié)果
我的名字 yang
當(dāng)局部變量和全局變量同名時(shí),在定義局部變量的子程序內(nèi),局部變量起作用疑俭,在其他地方全局變量起作用
name='yang'
def test1():
name='li'
print('我的名字',name)
test1()
print(name)
運(yùn)行結(jié)果
我的名字 li
yang
global
定義全局變量
如果在函數(shù)體內(nèi)要求修改全局變量,則需要在函數(shù)體內(nèi)聲明婿失,global 變量名
name='yang'
def test2():
global name #聲明我現(xiàn)在用的name是全局的
name='li'
print('我的名字',name)
test2()
print(name)
運(yùn)行結(jié)果
我的名字 li
li #因?yàn)樵诤瘮?shù)體內(nèi)已經(jīng)把全局變量更改了钞艇,所以輸出的是更改后的
==注意:global 最好寫在函數(shù)體最前面的位置==
#這個(gè)是錯(cuò)誤的,global不應(yīng)該放在name='li'的下面豪硅,這樣會(huì)報(bào)錯(cuò)
name='yang'
def test2():
name='li'
global name #聲明我現(xiàn)在用的name是全局的
print('我的名字',name)
test2()
print(name)
- 函數(shù)內(nèi)部沒有g(shù)lobal關(guān)鍵字哩照,優(yōu)先讀取局部變量,如果沒有局部變量懒浮,則只有讀取全局變量飘弧,但無(wú)法對(duì)全局變量重新賦值,但是對(duì)于可變類型砚著,可以對(duì)內(nèi)部元素進(jìn)行操作
c=['劉','張']
def func2():
c.append('李')
print(c)
func2()
運(yùn)行結(jié)果
['劉', '張', '李']
- 如果函數(shù)內(nèi)部有g(shù)lobal關(guān)鍵字次伶,變量本質(zhì)上就是全局變量的那個(gè)變量,可讀取可賦值
NAME='劉'
def func():
#NAME='張'
global NAME
print('我姓',NAME)
NAME='李'
print('我姓',NAME)
def func1():
print('我姓', NAME)
func1()
func()
print(NAME)
運(yùn)行結(jié)果
我姓 劉
我姓 劉
我姓 李
李
==規(guī)則:以后在定義時(shí)稽穆,全局變量全部大寫学少,局部變量全部小寫==
函數(shù)嵌套:
NAME ='海風(fēng)'
def func():
name='黃偉'
print(name)
def func1():
name='劉洋'
print(name)
def func2():
name='陸志華'
print(name)
print(name)
func2()
func1()
print(name)
func()
運(yùn)行結(jié)果
黃偉
劉洋
劉洋
陸志華
黃偉
運(yùn)行流程:
在這里插入圖片描述
name='hh'
def func():
name='kk'
def func1():
global name
name='gg'
func1()
print(name)
print(name)
func()
print(name)
運(yùn)行結(jié)果
hh
kk
gg
nonlocal
指定上一級(jí)變量
name='hh'
def func():
name='kk'
def func1():
nonlocal name #nonlocal,指定上一級(jí)變量
name='gg'
func1()
print(name)
print(name)
func()
print(name)
運(yùn)行結(jié)果
hh
gg
hh
在這里插入圖片描述