Python的函數(shù)參數(shù)傳遞:傳值?引用?

1 、分清一些概念

變量與對象:在python中,類型屬于對象,變量是沒有類型的。

所有的變量都可以理解為是內(nèi)存中一個對象的“引用”

所以,希望大家在看到一個python變量的時候,把變量和真正的內(nèi)存對象分開。類型是屬于對象的,而不是變量。這樣,很多問題就容易思考了。

例如:

nfoo = 1   #一個指向int類型的nfoo(再次提醒,nfoo沒有類型) 
listFoo = [1]   #一個指向list類型的listFoo,這個list中包含一個整數(shù)1。

還是上面的例子:

 nfoo = 2

這時,內(nèi)存中原始的1對象因為不能改變,于是被“拋棄”,令nfoo指向一個新的int對象,其值為2

listFoo[0] = 2   

更改list中第一個元素的值,因為list是可改變的,所以,第一個元素變更為2,其實應該說有一個新int對象被指定給listFoo 所指向的對象的第一個值,但是對于listFoo 來說,所指向的對象,并沒有變化。

2、Python的函數(shù)參數(shù)傳遞:傳值?引用?

對于變量(與對象相對的概念),其實python函數(shù)參數(shù)傳遞可以理解為就是變量傳值操作 。

看例子:

def ChangeInt( a ):  
      a = 10  # change the number  
   
nfoo = 2    
ChangeInt(nfoo)  
print nfoo #結果是2  

這時發(fā)生了什么?有一個int對象2,和指向它的變量nfoo,當傳遞給ChangeInt的時候,按照傳值的方式,復制了變量nfoo的值,這樣,a就是nfoo指向同一個Int對象了,函數(shù)中a=10的時候,發(fā)生什么?(還記得我上面講到的那些概念么),int是不能更改的對象,于是,做了一個新的int對象,令a指向它(但是此時,被變量nfoo指向的對象,沒有發(fā)生變化)

def ChangeList( a ):  
      a[0] = 10  # change the number  
   
listFoo = [2]  
ChangeList(listFoo )  
print listFoo #結果是[10]  

當傳遞給ChangeList的時候,變量仍舊按照“傳值”的方式,復制了變量listFoo 的值,于是a和listFoo 指向同一個對象,但是,list是可以改變的對象,對a[0]的操作,就是對listFoo指向的對象的內(nèi)容的操作,于是,這時的a[0] = 10,就是更改了listFoo 指向的對象的第一個元素,所以,再次輸出lstFoo 時,顯示[10],內(nèi)容被改變了

現(xiàn)在是不是對python中的變量和對象的概念有了更深入的理解了呢?通過我上面的解釋,我想大家也可以自己搞定其他類型對象的傳遞問題了吧。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容

  • http://python.jobbole.com/85231/ 關于專業(yè)技能寫完項目接著寫寫一名3年工作經(jīng)驗的J...
    燕京博士閱讀 7,606評論 1 118
  • 〇、前言 本文共108張圖,流量黨請慎重! 歷時1個半月,我把自己學習Python基礎知識的框架詳細梳理了一遍。 ...
    Raxxie閱讀 19,016評論 17 410
  • 平凡、簡單、瑣碎、滿足。這就是默默無聞的幸福吧。
    梓埠的魚閱讀 500評論 0 1
  • 目前討論MVP MVVM 的架構也來越多,這種構架也很適合Android。研究MVP記錄如下 源碼地址RxMVP...
    Javen205閱讀 400評論 0 0
  • 有這么一個網(wǎng)站,家有空余房間的房東愿意出租給陌生人住宿,也有人愿意在陌生的城市借宿在家庭旅館,他們各取所需并留下介...
    喵了個喵__閱讀 585評論 0 0