知識點:Python中,萬物皆對象。
python中不存在所謂的傳值調用,一切傳遞的都是對象的引用,也可以認為是傳址。
一、可變對象和不可變對象
Python在heap中分配的對象分成兩類:可變對象和不可變對象。所謂可變對象是指,對象的內容可變,而不可變對象是指對象內容不可變。
不可變(immutable):int、字符串(string)、float、(數值型number)、元組(tuple)
可變(mutable):字典型(dictionary)、列表型(list)
不可變類型特點:
看下面的例子(例1)
- i = 73
- i += 2
從上圖可知,不可變對象的特征沒有變,變的只是創建了新對象,改變了變量的對象引用。
看一個例子(例2)
>>>x = 1 >>>y = 1 >>>x = 1 >>> x is y True >>>y is z True
如上所示,因為整數為不可變,x,y,z在內存中均指向一個值為1的內存地址,也就是說,x,y,z均指向的是同一個地址,值得注意的是,整形來說,目前僅支持(-1,100)。
總結一下,不可變對象的優缺點。
優點是,這樣可以減少重復的值對內存空間的占用。
缺點呢,如例1所示,我要修改這個變量綁定的值,如果內存中沒用存在該值的內存塊,那么必須重新開辟一塊內存,把新地址與變量名綁定。而不是修改變量原來指向的內存塊的值,這回給執行效率帶來一定的降低。
下面看一個可變對象的例子(例3)
m=[5,9] m+=[6]
二、函數參數:
Python函數參數對於可變對象,函數內對參數的改變會影響到原始對象;對於不可變對象,函數內對參數的改變不會影響到原始參數。原因在於:
1、可變對象,參數改變的是可變對象,其內容可以被修改。
2、不可變對象,改變的是函數內變量的指向對象。
比如存在2個列表 a 和 b
如果a=b的話, a和b的地址是相同的;如果只是想拷貝,那么就得用 a=b[:]
參考鏈接:
http://www.cnblogs.com/evening/archive/2012/04/11/2442788.html
http://thomaschen2011.iteye.com/blog/1441254