我們都知道在python中一起都是對象,在這個基礎上,python語言還區分了可變對象和不可變對象,不可變對象有包括int, float, bool, str,可變對象包括字典(dict), 集合(set), 元組(tuple), 列表(list),對于初學者而言,可變對象和不可變對象有什么區別,可能會導致一些困擾,在這篇文章中我們就重點說一下他們的不同。
我們先來個例子看一下:
>>> x = 1001
>>> x
1001
>>> x = 1002
>>> x
1002
從上面的代碼結果看你可能會有很困惑,x值改變了呀,不是說整形不可變對象嗎,我看x值變了呀,抱歉,你這么想是錯誤的,因為x只是創建的對象引用,這里并沒有改變對象,而且創建了一個新對象,x又引用到了新對象上,要明白具體情況,這就需要用到我們之前文章提到的id()函數,id()函數可以顯示這個對象的唯一標識,我們看一下這2個是不是具體有相同的標識符就可以了:
>>> x = 1001
>>> x
1001
>>> id(x)
2127754933936
>>>
>>> x = 1002
>>> x
1002
>>> id(x)
2127757136816
我們可以看到這是2個不同的唯一標識符,可以理解這是2個不同的對象,那可能要問,x指向了1002,那1001去哪里了?1001那也沒去,只是沒有對象的引用了,就是說無法被訪問到了,根據python內部計數器原理,當一個對象引用為0的時候,會被自動回收掉,當然這都是python內部機制,都是自動運行的。
所以說整型就是不可變對象,當創建后就不可變化了。
我們再說一下可變對象,我們拿列表舉例說明:
>>> mylist = [1,2,3]
>>> id(mylist)
2127754786120
>>> mylist[0] = 8
>>> mylist
[8, 2, 3]
>>> id(mylist)
2127754786120
從以上代碼中可以看到,我們及時改變了列表的值,但列表的內存地址并沒有變,也就是對象還是之前的對象,這就是可變對象,那這里我們修改了列表的值,那如果用append()方法添加值呢?會創建一個新的對象嗎?我們看結果:
>>> mylist = [1,2,3]
>>> id(mylist)
2127749796872
>>> mylist.append(4)
>>> mylist
[1, 2, 3, 4]
>>> id(mylist)
2127749796872
>>>
>>> mylist.pop()
4
>>> mylist
[1, 2, 3]
>>> id(mylist)
2127749796872
從以上代碼可以看到,我們對列表增加值,列表的唯一標識符沒有改變,對應的我們移出某個值,同樣內存地址不會發生改變,對象始終是一個,不會產生新的對象出來,這就是可變對象。
了解了可變和不可變對象,我們接下來說一下字典的key為什么不能是可變對象,假如我們定義個字典如下:
>>> d = {[1,2]:'a'}
Traceback (most recent call last):
File "
TypeError: unhashable type: 'list'
當用列表來當key的時候會直接報錯,那為什么不能用列表來當key呢,那我們不如反過來想,假設python運行我們用列表來當key,我們定義字典如下:
>>> d = {[1,2,3]:'a', [1,2]:'b'}
那現在我們可以通過key[1,2,3]訪問到了值a, 我們通過key[1,2]訪問到了值b,因為列表是可變對象,那我們修改key[1,2]為[1,2,3], 如下:
>>> d = {[1,2,3]:'a', [1,2,3]:'b'}
那么問題就來了,現在2個key一樣,當我用key[1,2,3]來獲取值的時候,該返回a還是b的值呢?所以到這里就運行不下去了,所以字典的key必須是不可變類型,這樣才能確定的得到該得到的值。
作者: Python運維技術 python運維技術
來源公眾號:
python運維技術
聲明:
本站(www.rxbbx.com)部分圖文轉自網絡,刊登本文僅為傳播信息之用,絕不代表贊同其觀點或擔保其真實性。若有來源標注錯誤或侵犯了您的合法權益,請作者持權屬證明與本網聯系,我們將及時更正、刪除,謝謝