Python是弱語(yǔ)言類型衡未,一切皆是對(duì)象佛玄。對(duì)象之間的操作,就需要變量存儲(chǔ)數(shù)據(jù)
本期激才,我們將回顧變量基本概念及變量作用域底層內(nèi)存分析
1. 變量簡(jiǎn)介
1.1 什么是變量
變量就是存儲(chǔ)對(duì)象間處理的數(shù)據(jù),并且變量是存儲(chǔ)在棧內(nèi)存里的
Python中變量具有兩個(gè)特點(diǎn):
- 變量無(wú)須聲明即可賦值:對(duì)不存在的變量賦值就相當(dāng)于在棧內(nèi)存定義新變量
- 變量的數(shù)據(jù)類型可以動(dòng)態(tài)改變:變量是指向?qū)ο蟮亩詈伲瑢?duì)象變化瘸恼,變量也跟著變化
變量的賦值是通過(guò)"="來(lái)進(jìn)行的,例如a=1,對(duì)象1賦值給變量a岩睁。
變量輸出钞脂,通過(guò)print()函數(shù)輸出變量結(jié)果。
變量的命名要求見(jiàn)名知意捕儒,合法變量遵循以下規(guī)則:
- 由字母冰啃、數(shù)字和下劃線組成,其數(shù)字不能開(kāi)頭
- 不能是Python內(nèi)置關(guān)鍵字名字如str,list等
- 不能包含空格
1.2 變量作用域
變量起作用的范圍稱為變量的作用域
不同的作用域內(nèi)同名變量之前互相不影響
變量分為全局變量和局部變量
- 全局變量
定義全局變量有兩種方法:
- 在函數(shù)外面定義刘莹,一般在文件開(kāi)頭進(jìn)行定義
- 在函數(shù)內(nèi)定義全局阎毅,使用內(nèi)置函數(shù)global聲明,但是不能只能直接賦值
- 局部變量
在函數(shù)內(nèi)定義的變量叫局部變量
局部變量不能被外部訪問(wèn)和使用点弯,否則程序會(huì)報(bào) NameError 錯(cuò)誤
2. 全局/局部變量?jī)?nèi)存分析
2.1 全局變量?jī)?nèi)存分析
全局變量作用范圍在整個(gè)程序中扇调,可以在函數(shù)內(nèi)部使用,也可以在函數(shù)外部進(jìn)行使用狼钮。
- 在函數(shù)和類定義之外聲名的
- 作用域?yàn)槎x的模塊碳柱,從定義位置開(kāi)始到模塊結(jié)束,一般定義在文件最開(kāi)頭的位置
- 全局變量降低了函數(shù)的通用性和可讀性性熬芜,應(yīng)盡量避免全局變量的使用
- 全局變量一般做常量使用
- 函數(shù)內(nèi)要改變?nèi)肿兞康闹盗停褂胓lobal聲明一下,但是
- 創(chuàng)建公共的文件里統(tǒng)一創(chuàng)建全局變量涎拉,使用import導(dǎo)入各個(gè)程序中
全局變量瑞侮,程序執(zhí)行過(guò)程中不會(huì)被系統(tǒng)銷(xiāo)毀回收,因此它存儲(chǔ)在靜態(tài)區(qū)域內(nèi)鼓拧,可以供多函數(shù)進(jìn)行使用半火。
由于全局變量是不會(huì)輕易銷(xiāo)毀的,如果有運(yùn)算速度的要求季俩,避免頻繁調(diào)用更改建議當(dāng)成常量使用
全局變量底層怎樣的钮糖,我們通過(guò)一個(gè)栗子來(lái)看看
# 定義一個(gè)全局變量
name = "JueJing"
Day = 30
def func1():
print ("func1函數(shù)中使用全局變量:",name) # 打印全局變量的值
def func2():
global Day #用global聲明全局變量
Day = 16 #重新賦值給全局變量
print("func2函數(shù)中使用全局變量:",Day)
#調(diào)用函數(shù)
func1()
print("單獨(dú)使用全局變量:",name)
func2()
print("單獨(dú)使用全局變量:",Day)
-
定義全局變量、函數(shù)
在棧內(nèi)存中創(chuàng)建全局變量种玛,并且指向存在靜態(tài)區(qū)的全局變量對(duì)象值
在棧內(nèi)存中創(chuàng)建函數(shù)棧區(qū)藐鹤,并指向堆內(nèi)存中函數(shù)對(duì)象func1(),func2()
-
調(diào)用函數(shù)
調(diào)用func1函數(shù)瓤檐,全局變量name可以正常進(jìn)行被函數(shù)使用赂韵,打印出
調(diào)用func2函數(shù),更改全局變量時(shí)挠蛉,要先使用global關(guān)鍵字聲明祭示,之后才能重新向全局變量Day復(fù)制成16的對(duì)象
- 程序運(yùn)行結(jié)果
2.2 局部變量?jī)?nèi)存分析
局部變量只能在函數(shù)內(nèi)進(jìn)行使用,具體特點(diǎn)如下
- 定義在函數(shù)體和類之內(nèi)聲明的
- 局部變量的引用比全局變量快谴古,優(yōu)先考慮
- 如果局部變量和全局變量同名质涛,則在函數(shù)內(nèi)隱藏全局變量,只使用同名的局部變量
為何局部變量不能在函數(shù)外使用掰担?
- 當(dāng)函數(shù)調(diào)用時(shí)汇陆,會(huì)在棧內(nèi)存中創(chuàng)建棧幀區(qū),存儲(chǔ)函數(shù)里面的所有的變量带饱。
- 當(dāng)函數(shù)執(zhí)行完成后毡代,函數(shù)里的變量空間會(huì)被Python回收器進(jìn)行收回
局部變量的內(nèi)存變化,我們也通過(guò)栗子來(lái)學(xué)習(xí)
# 定義一個(gè)函數(shù)Sum
n = 10
def func():
m = 100
n = 200
Sum = m + n
print("func函數(shù)里的局部變量n:",n)
print("func函數(shù)結(jié)果Sum:",Sum)
#調(diào)用函數(shù)
print("全局變量n:",n)
func() #局部變量會(huì)優(yōu)先全局變量
- 定義函數(shù)勺疼,局部變量
在堆內(nèi)存中創(chuàng)建函數(shù)教寂,并且在棧幀區(qū)定義變量m,n
在靜態(tài)區(qū)創(chuàng)建全局變量對(duì)象10,并指向棧內(nèi)存中變量n
- 調(diào)用函數(shù)
調(diào)用函數(shù)func(),當(dāng)局部變量與全局變量一樣時(shí)执庐,函數(shù)會(huì)優(yōu)先選擇局部變量酪耕。
- 運(yùn)行程序執(zhí)行
注意: 局部變量在函數(shù)外使用,Python解釋器會(huì)報(bào)錯(cuò)
print(m) #函數(shù)外使用變量m會(huì)報(bào)nameerror
總結(jié)
全局變量和局部變量轨淌,我們?cè)诠ぷ髦杏厮福凑招枨笕ミx擇看尼。
全局變量適用于不經(jīng)常變化的值,適合做常量
局部變量適合經(jīng)常變東更改的操作盟步,速度比全局變量快狡忙。
好啦,以上是本期內(nèi)容址芯,歡迎大佬們?cè)u(píng)論區(qū)指正灾茁,下期見(jiàn)~