1. 程式人生 > >孤荷凌寒自學python第十八天python變數的作用範圍

孤荷凌寒自學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