有人問,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是互補關係,很多場景需要不可變得特性。