孤荷淩寒自學python第十八天python變量的作用範圍
孤荷淩寒自學python第十八天python函數的形參與變量的範圍
(完整學習過程屏幕記錄視頻地址在文末,手寫筆記在文末)
一、在python的函數中各種不同的形式參數在定義的先後順序上有規定:
必須形式參數,可選形式參數,*可變形式參數,**關鍵字形式參數
二、變量的作用範圍(作用域)
1 局部變量
在函數內定義的變量,其作用範圍默認情況下也就只在函數體內有效;
其中函數定義時定義的所有形式參數都算作函數內定義的變量;
函數內部的變量稱之為【局部變量】
此外,當一個實參傳遞給函數的形參時,對於python而言,不存在【傳址】和【傳值】的說法!!因為在python中,所以的實參傳遞給函數的形參時,都只是將實參的【值】給了形參,也就是說將實參進行了【深復制】在內存中重新開辟了新的地址來復制了一份完全獨立的值,再給了函數的形參。
這意味著,python函數體內部形式參數作為局部變量,不管它的值在運算中怎麽改變,都不會影響到傳遞值給它的來自函數外部的實參。
這一點和其它某些語言有比較大的不同。
測試如下:
def func(我是形式參數):
我是形式參數+=10
我是函數內局部變量=我是形式參數
print(‘我是形式參數在獲取了實參的值後+10的結果是:‘,我是形式參數)
print(‘我是函數內局部變量=‘,我是函數內局部變量)
return
我是變量作實參=12
print(‘在作實參之前【我是變量作實參】=‘,我是變量作實參)
func(我是變量作實參)
print(‘在作實參之後【我是變量作實參】=‘,我是變量作實參)
print(‘下面在函數體之外訪問函數的內部變量,因為它的作用域只在函數內部,所以下一語句必定報錯:‘)
print(‘在函數體之外訪問【我是函數內局部變量】=‘,我是函數內局部變量)
運算結果 :
在作實參之前【我是變量作實參】= 12
我是形式參數在獲取了實參的值後+10的結果是: 22
我是函數內局部變量= 22
在作實參之後【我是變量作實參】= 12
下面在函數體之外訪問函數的內部變量,因為它的作用域只在函數內部,所以下一語句必定報錯:
Traceback (most recent call last):
File "c:\Users\pw\Desktop\新建文本文檔.py", line 12, in <module>
print(‘在函數體之外訪問【我是函數內局部變量】=‘,我是函數內局部變量)
NameError: name ‘我是函數內局部變量‘ is not defined
從上面的測試中可以看到,函數內部定義的【局部變量】包括函數定義時定義的【形式參數】它們的作用域只存在於函數體內部,一離開函數體,就不存在了。
從測試中也看出,作為實參傳遞給函數形式參數的變量【我是變量作實參】在作函數實參前和作函數實參後,值都不變化 ,這就證明在python中,傳遞給函數形參的任何作函數 實參的變量都是安全的,這與其它一些編程語言是有區別的。
2 全局變量
全局變量其實也是一個相對的說法,一般來說,在同一個py文件中,在函數體之外定義的變量,對於函數體內的對象來說,就是一個全局變量。
如上一個測試例子中,對於函數【func】內部的所在對象來說,在函數之外定義的變量【我是變量作實參】就是一個全局變量。
在函數內部是可以直接使用全局變量的;
如果函數內部定義的變量與函數外定義的全局變量的命名是一樣的,那麽,在函數內部就都認為是局部變量,這是優先級的不同,即默認函數體自己內部定義的變量優先識別。
測試:
def func(x):
print(‘在函數內部print,z=‘,z)
y=‘局部部變量y‘
print(‘在函數內部Print,y=‘,y)
print(‘函數的形參x剛獲取實參的值時,在函數內部Print,x=‘,x)
x=x.replace(‘全局‘,‘局部‘)
print(‘在函數內部print,x=‘,x)
return ‘函數處理後的x=‘ + x #將運算後的x作為函數的返回對象返回給函數外部
x=‘全局變量x‘
y=‘全局變量y‘
z=‘全局變量z‘
a=func(x)
print(‘在函數外部print,x=‘,x)
print(‘在函數外部print,y=‘,y)
print(‘在函數外部print,z=‘,z)
print(‘打印函數返回值a變量print,a=‘,a)
運行結果 :
在函數內部print,z= 全局變量z
在函數內部Print,y= 局部部變量y
函數的形參x剛獲取實參的值時,在函數內部Print,x= 全局變量x
在函數內部print,x= 局部變量x
在函數外部print,x= 全局變量x
在函數外部print,y= 全局變量y
在函數外部print,z= 全局變量z
打印函數返回值a變量print,a= 函數處理後的x=局部變量x
三、在函數內部也可以定義全局變量
由於python的函數的形式參數接收實際參數時,只是接收了實際參數的值,因此 在函數內部不管怎麽運算都不會對作為實際參數的全局變量有任何改變。
然而在某些時候,我們其實還是需要在函數內部就直接修改掉全局變量的值的。
當然有一種方法是,因為函數內部可以直接訪問全局變量,所以我們可以直接使用全局變量,然後修改值就行了;
然而在更特殊的情況下,我們還希望在函數內部就直接定義出一個全局變量,讓函數外的對象也可以使用此函數內部定義的變量。
python提供了這樣的實現方法,在函數內部想要定義一個全局變量時,只需要在變量名稱前添加關鍵字 global 即可。
註意:在給變量添加global 關鍵字時,不能再在變量後面同時進行賦值。
測試:
x=‘全局變量x‘
y=‘全局變量y‘
z=‘全局變量z‘
def func(x):
global z
z=z + ‘_在函數內部修改了一個全局變量z‘
print(‘在函數內部print,z=‘,z)
global y
y=‘局部部變量y‘
print(‘在函數內部Print,y=‘,y)
print(‘函數的形參x剛獲取實參的值時,在函數內部Print,x=‘,x)
x=x.replace(‘全局‘,‘局部‘)
print(‘在函數內部print,x=‘,x)
return ‘函數處理後的x=‘ + x #將運算後的x作為函數的返回對象返回給函數外部
a=func(x)
print(‘在函數外部print,x=‘,x)
print(‘在函數外部print,y=‘,y)
print(‘在函數外部print,z=‘,z)
print(‘打印函數返回值a變量print,a=‘,a)
運行結果:
在函數內部print,z= 全局變量z_在函數內部修改了一個全局變量z
在函數內部Print,y= 局部部變量y
函數的形參x剛獲取實參的值時,在函數內部Print,x= 全局變量x
在函數內部print,x= 局部變量x
在函數外部print,x= 全局變量x
在函數外部print,y= 局部部變量y
在函數外部print,z= 全局變量z_在函數內部修改了一個全局變量z
打印函數返回值a變量print,a= 函數處理後的x=局部變量x
與前一個測試例子一比較,就可以發現global關鍵字的神奇作用。
——————————
今天整理的學習筆記完成,最後例行說明下我的自學思路:
根據過去多年我自學各種編程語言的經歷,認為只有真正體驗式,解決實際問題式的學習才會有真正的效果,即讓學習實際發生。在2004年的時候我開始在一個鄉村小學自學電腦 並學習vb6編程語言,沒有學習同伴,也沒有高師在上,甚至電腦都是孤島(鄉村那時還沒有網絡),有的只是一本舊書,在痛苦的自學摸索中,我找到適應自己零基礎的學習方法:首先是每讀書的一小節就作相應的手寫筆記,第二步就是上機測試每一個筆記內容是否實現,其中會發現書中講的其實有出入或錯誤,第三步就是在上機測試之後,將筆記改為電子版,形成最終的修訂好的正確無誤的學習筆記 。
通過反復嘗試錯誤,在那個沒有分享與交流的黑暗時期我摸黑學會了VB6,爾後接觸了其它語言,也曾聽過付費視頻課程,結果發現也許自己學歷果然太低,就算是零基礎的入門課程,其實也難以跟上進度,講師的教學多數出現對初學者的實際情況並不了解的情況,況且學習者的個體也存在差異呢?當然更可怕的是收費課程的價格往往是自己難以承受的。
於是我的所有編程學習都改為了自學,繼續自己的三步學習筆記法的學習之路。
當然自學的最大問題是會走那麽多的彎路,沒有導師直接輸入式的教學來得直接,好在網絡給我們帶來無限搜索的機會,大家在網絡上的學習日誌帶給我們共享交流的機會,而QQ群等交流平臺、網絡社區的成立,我們可以一起自學,互相批評交流,也可以獲得更有效,更自主的自學成果。
於是我以人生已過半的年齡,決定繼續我的編程自學之路,開始學習python,只希望與大家共同交流,一個人的獨行是可怕的,只有一群人的共同前進才是有希望的。
誠摯期待您的交流分享批評指點!歡迎聯系我加入從零開始的自學聯盟。
這個時代互聯網成為了一種基礎設施的存在,於是本來在孤獨學習之路上的我們變得不再孤獨,因為網絡就是一個新的客廳,我們時刻都可以進行沙龍活動。
非常樂意能與大家一起交流自己自學心得和發現,更希望大家能夠對我學習過程中的錯誤給予指點——是的,這樣我就能有許多免費的高師了——這也是分享時代,社區時代帶來的好福利,我相信大家會的,是吧!
根據完全共享的精神,開源互助的理念,我的個人自學錄制過程是全部按4K高清視頻錄制的,從手寫筆記到驗證手寫筆記的上機操作過程全程錄制,但因為4K高清文件太大均超過5G以上,所以無法上傳至網絡,如有需要可聯系我QQ578652607對傳,樂意分享。上傳分享到百度網盤的只是壓縮後的720P的視頻。
我的學習過程錄像百度盤地址分享如下:(清晰度:1280x720)
鏈接:https://pan.baidu.com/s/1sKTmAEohuNOpkiAT0VAkIg 密碼:oog7
Bilibili:
https://www.bilibili.com/video/av35842582/
喜馬拉雅語音筆記:
https://www.ximalaya.com/keji/19103006/139450521
孤荷淩寒自學python第十八天python變量的作用範圍