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中的變量和對象的概念有了更深入的理解了呢?通過我上面的解釋,我想大家也可以自己搞定其他類型對象的傳遞問題了吧。