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,其實應(yīng)該說有一個新int對象被指定給listFoo 所指向的對象的第一個值神僵,但是對于listFoo 來說雁刷,所指向的對象,并沒有變化保礼。
2沛励、Python的函數(shù)參數(shù)傳遞:傳值?引用炮障?
對于變量(與對象相對的概念)目派,其實python函數(shù)參數(shù)傳遞可以理解為就是變量傳值操作 。
看例子:
def ChangeInt( a ):
a = 10 # change the number
nfoo = 2
ChangeInt(nfoo)
print nfoo #結(jié)果是2
這時發(fā)生了什么胁赢?有一個int對象2企蹭,和指向它的變量nfoo,當傳遞給ChangeInt的時候智末,按照傳值的方式谅摄,復(fù)制了變量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 #結(jié)果是[10]
當傳遞給ChangeList的時候,變量仍舊按照“傳值”的方式何乎,復(fù)制了變量listFoo 的值句惯,于是a和listFoo 指向同一個對象土辩,但是,list是可以改變的對象抢野,對a[0]的操作拷淘,就是對listFoo指向的對象的內(nèi)容的操作,于是指孤,這時的a[0] = 10启涯,就是更改了listFoo 指向的對象的第一個元素,所以恃轩,再次輸出lstFoo 時结洼,顯示[10],內(nèi)容被改變了
現(xiàn)在是不是對python中的變量和對象的概念有了更深入的理解了呢叉跛?通過我上面的解釋松忍,我想大家也可以自己搞定其他類型對象的傳遞問題了吧。