Python關於不可變對象

Python關於不可變對象

(關於學習廖雪峯Python教程的一些個人總結)

首先什麼是不可變對象,不可變對象首先是個對象,一旦創立了這個對象,這個對象就不能再改變了。

關於數字,字符串

Python中數字,字符串都是不可變對象,咦?你可能問怎麼不可變,我令a=1,我還可以再令a=2,我令s='abc',我還可以再令s='ABC'

注意這個說法是錯誤的,因爲你改變的是變量而不是數字對象或者字符串對象本身,根據Python的變量存儲方式,a=1或者s='abc'是在內存中開闢一塊空間創建了1或'abc'這個數字對象或者字符串對象,然後變量a或s不過是指向數據對象的地址,而再次令a=2或者s='ABC',Python不過是又在內存空間中創建了一個新的2或者’ABC’這個數字對象或字符串對象,然後讓變量a或者s指向新的數據地址,而原來內存中的1和'abc'並沒有改變。

再比如字符串的replace方法:

a = 'abc'
print(a.replace('a', 'A'))
print(a)

輸出結果是:

'Abc'
'abc'

原因就是字符串對象是不可變對象,使用replace方法不過是又創建了一個新的字符串對象'Abc',原來的'abc'沒變,而且a依然指向它。

關於元組tuple

元組一般是不可變的,一旦創建,就不能改變,比如:

t = (1, 2, 3)

這樣,你賦值t[0] = 10是不行的。

但是下面這個情況,他卻是“可變的”(???不是剛說了不可變嘛)

t = ('a', 'b', ['A', 'B'])
t[2][0] = 'X'
t[2][1] = 'Y'
print(t)

發現t改變了,變成了

('a', 'b', ['X', 'Y'])

我們先看看定義的時候tuple包含的3個元素:

tuple-0

當我們把list的元素'A''B'修改爲'X''Y'後,tuple變爲:

tuple-1

表面上看,tuple的元素確實變了,但其實變的不是tuple的元素,而是list的元素。tuple一開始指向的list並沒有改成別的list,所以,tuple所謂的“不變”是說,tuple的每個元素,指向永遠不變

即0還是指向字符串a,1還是指向字符串b,2還是指向這個list列表。只不過list列表本身是可變的。

所以說(1, 2, 3)本質上是不可變對象,而(1, [2, 3])本質上是可變對象,下面我們會看到爲什麼。

關於字典和集合

字典相當於map,使用鍵值對存儲,使用哈希計算,鍵不能重複,而集合也是一組鍵的集合,不能重複。

由於鍵不能重複的這條性質就要求,字典的鍵和集合中的元素必須是不可變對象,因爲無法判斷兩個可變對象是否相等。

所以下面代碼是可行的:

d = {(1, 2, 3): 'haha'}
s = s = set([(1, 2, 3)]) # set集合中加一個元組(1, 2, 3)

下面的代碼會報錯:

d = {(1, [2, 3]): 'haha'}
s = s = set([(1, [2, 3])]) # set集合中加一個元組(1, [2, 3])
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章