python 的 tuple(元組) 是不是冗餘設計?

有人問,python 的 tuple(元組) 是不是冗餘設計?因爲它和list(列表)很像。

先拋觀點,tuple不是冗餘設計,它最大的特點是不可變,在Python程序設計中非常重要。

tuple與list區別

tuple中文翻譯成元組,它和list(列表)像是一對兄弟,兩者都是容器,很多用途、方法都一致,主要的區別是list可變,tuple不可變,tuple更輕量。

差異如下:

不可變(Immutable)是什麼意思?

就是你不可以修改、增減tuple的值。 也因爲 tuple 不可變的特性,所以沒有append()、remove()、pop()等會更動值的操作。

爲什麼tuple輕量,佔用內存小?

先看如下案例,存放同樣的內容,元組的存儲空間比列表要少16字節。

主要是因爲列表是動態的,需要存儲指針,同時需要額外存儲已經分配的長度大小,都會佔用存儲空間。

爲什麼tuple更快?

因爲Python的垃圾回收機制,會回收不用的變量,而對於靜態數據則會做資源緩存處理,這樣調用元組的時候拿來即用,會加快運行速度。

tuple使用場景

1、作爲函數返回容器。

比如返回經緯度,存儲的數據不需要變動,這時候使用tuple更準確、也節省內存。

def get_location():
    ......
    return (lon,lat)

2、作爲字典的鍵

我們知道Python字典的鍵要求不可變,如果你想將容器作爲鍵,非tuple不可。

3、打包解包

打包是把一堆元素放到容器裏,解包是把容器裏的元素分別賦值給變量。

比如說有這樣一個元組t:

>> t = ('foo', 'bar', 'baz', 'qux')

上面就好像元組中的項目已被“打包”到對象中。

你可以通過索引,獲取其中的元素。

>>> t
('foo', 'bar', 'baz', 'qux')
>>> t[0]
'foo'
>>> t[-1]
'qux'

如果隨後將該“打包”對象分配給新元組,則各個項目將“解包”到元組中的對象中。

演示一下:

>>> (s1, s2, s3, s4) = t
>>> s1
'foo'
>>> s2
'bar'
>>> s3
'baz'
>>> s4
'qux'

其實也可以將打包解包合併成一個語句:

(s1, s2, s3, s4) = ('foo', 'bar', 'baz', 'qux')

tuple常用方法

tuple的內置方法不是很多,畢竟不可變。

綜上所述,tuple和list是互補關係,很多場景需要不可變得特性。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章