python tips - Python可變對象和不可變對象


且看如下例子:

>>> l = [1, 2, 3]
>>> ll = l >>> ll.remove(1)
>>> l
[2, 3] >>> 
>>> l = [1, 2, 3]
>>> ll = l[:] >>> ll.remove(1)
>>> l
[1, 2, 3] >>> 

是不是有點大吃一驚,跟c 語言怎么不一樣呢?!

 

>>>a = [1]
>>>b = a 
>>>b[0] = 2
>>>a
[2]

列表是可變對象類型,因此傳遞的時候,變量名b綁定的內存地址與a綁定的內存地址是同一地址。

 

>>> x = 1
>>> y = 1
>>> x is y
True >>>

數值為不可變類型,x與y指向的是數值為1的同一內存地址。

 

對於類來說也是如此:

class b:
 x = [] def set(self):
        self.x.append(1)
    def get(self):
        return self.x

for i in range(3):
 a = b() print b.__dict__
    a.set()
    print a.get()

結果:

{'x': [], '__module__': '__main__', 'set': <function set at 0x7f89a319bcf8>, '__doc__': None, 'get': <function get at 0x7f89a319bd70>}
[1]
{'x': [1], '__module__': '__main__', 'set': <function set at 0x7f89a319bcf8>, '__doc__': None, 'get': <function get at 0x7f89a319bd70>}
[1, 1]
{'x': [1, 1], '__module__': '__main__', 'set': <function set at 0x7f89a319bcf8>, '__doc__': None, 'get': <function get at 0x7f89a319bd70>}
[1, 1, 1]
 

 

python中,萬物皆對象。python中不存在所謂的傳值調用,一切傳遞的都是對象的引用,也可以認為是傳址。

python中,對象分為可變(mutable)和不可變(immutable)兩種類型。

組(tuple)、數值型(number)、字符串(string)均為不可變對象,而字典型(dictionary)和列表型(list)的對象是可變對象。

>>>a = 1 #將名字a與內存中值為1的內存綁定在一起
>>>a = 2 #將名字a與內存中值為2的內存綁定在一起,而不是修改原來a綁定的內存中的值,這時,內存中值為1的內存地址引用計數-1,當引用計數為0時,內存地址被回收
>>>b = a #變量b執行與a綁定的內存
>>>b = 3 #創建一個內存值為3的內存地址與變量名字b進行綁定。這是a還是指向值為2的內存地址。
>>>a,b
>>>(2,3)

 

python函數參數的默認值與此的關系及例子,詳見 python tips - 注意 python 函數參數的默認值http://www.cnblogs.com/congbo/archive/2012/11/29/2794413.html

 

參考: 

http://thomaschen2011.iteye.com/blog/1441254

http://www.cnblogs.com/evening/archive/2012/04/11/2442788.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM