1. 程式人生 > >可變物件與不可變物件

可變物件與不可變物件

  在之前的一篇文章“python中的賦值 值傳遞?”中,因為在呼叫方法時與方法內部,輸出id是相同,所以不能理解官方的那句話

Remember that arguments are passed by assignment in Python.  要記住,Python 裡的引數是通過賦值傳遞的。

  之後還是從記憶體模擬上理解的。其實是我有一點搞錯了,官方的話是沒問題的,我論證的姿勢是錯的—兩個地方輸出id是相同的,並不能說明python是傳值還是傳地址。官方說只有傳值,那去反駁的話,得在呼叫方法的地方和方法內部,都輸出值,兩個地方的值不同,這才是正確的反駁姿勢。呼叫id()方法,只是輸出記憶體地址,兩個記憶體地址相同,並不能說明python就不是傳值。

  好了,現在開始講本文的主題–可變物件和不可變物件,在python中,可變物件包括:list、set、dict、自定義物件,不可對物件包括:int、float、str、bool、tuple等。不可變物件步允許自身內容進行修改。如果我們隊一個不可變物件進行賦值,實際上是生成一個新物件,再讓變數指向這個物件。哪怕這個物件簡單到只是數字0和1

    a=0
    print('a',id(a))
    a=1
    print('a',id(a))

輸出:

    a 4453151440
    a 4453151472

因為物件不可變,所以為了提高效率,python會使用一些公共物件,比如

a=1
print('a',id(a))
b=1
print('b'),id(b))
print(a==b)
print(a is b )
c='hello world'
print('c',id(c))
d='hello world'
print('d',id(d))
print(c==d)
print(c is d)

輸出:

    a 442376776
    b 442376776
    True
    True
    c 4430180912
    c 4430180912
    True
    True

Tips: is 這個操作符,判斷是否為同一個物件,也就是地址是否一致。 == 操作符只判斷“值”是否相等

  如果我們需要產生一個list物件的副本,可以通過[:]來獲得,對副本賦值一個變數,進行修改,不會影響到之前的list,因為他們已經不是同一個物件了。

  那麼如果是下面請看呢:

    m=[1,2,[3]]
    n=m[:]
    n[1]=4
    n[2][0]=5
    print(m)

輸出結果是 [1,2,5],為什麼會是這樣呢?因為物件的賦值是通過淺拷貝的。