可變物件與不可變物件
阿新 • • 發佈:2018-11-10
在之前的一篇文章“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],為什麼會是這樣呢?因為物件的賦值是通過淺拷貝的。