1. 程式人生 > >python 元組(tuple)和列表(list)區別

python 元組(tuple)和列表(list)區別

一、前言

想必大家都知道,在Python資料型別中有兩個物件:元組 tuple 和列表 list 。

它們的寫法和用法都十分相似,傻傻分不清楚。可能有的同學就會瘋狂的去網上查詢它們之間的區別了,可是查到的無外乎有以下幾種說法:

list 是可變的物件,元組 tuple 是不可變的物件!

由於 tuple 不可變,所以使用 tuple 可以使程式碼更安全!等等 ...

但是 tuple 究竟有什麼用呢,到頭來還是不知道。

二、tuple 

其實在很多比較“資深”的程式語言裡開始是沒有元組的,比如:Java、C++、C# 等,但是由於元組的靈活和便捷性,最後這些程式語言也都紛紛加上了。並且很多年輕的程式語言 Python、Scala 等,一開始就內建了元組型別。

之所以元組這麼受歡迎,其實最關鍵的一點是它的語法的靈活和便捷性,提高了程式設計體驗。其中最大的一個特性就是使函式可以返回多個值,這個特性很常用。

1. 函式返回(return)多個值

函式返回多個值?對,你沒有聽錯。函式是可以返回多個值的。如:

 

非常簡單,就是一個返回座標值(x , y)的函式,我們同時獲取了多個值 x 和 y 。

但是這和 tuple元組有什麼關係了?

其實這裡存在一個假象,Python函式返回的值本質上還是一個單值,看下面程式碼:

從列印結果可以看出,這裡返回值就是一個tuple!由於在語法上,返回一個tuple是可以省略括號的,而多個變數可以同時接收一個tuple,按位置賦給對應的值。

所以,Python的函式返回多值時,其實就是返回一個tuple。是不是突然覺得 tuple 幫了大忙,使結果的獲取更簡單了呢?

2. tuple 不可變的好處

相對於 list 而言,tuple 是不可變的,這使得它可以作為 dict 的 key,或者扔進 set 裡,而 list 則不行。

tuple 放棄了對元素的增刪(記憶體結構設計上變的更精簡),換取的是效能上的提升:建立 tuple 比 list 要快,儲存空間比 list 佔用更小。所以就出現了“能用 tuple 的地方就不用 list”的說法。

多執行緒併發的時候,tuple 是不需要加鎖的,不用擔心安全問題,編寫也簡單多了。

二、元組到底可不可以被修改

1、建立和訪問一個元組如果建立一個空元組,直接使用小括號即可;
如果要建立的元組中只有一個元素,要在它的後面加上一個逗號‘,’。

>>> temp = ()
>>> type(temp)
     <class 'tuple'>

>>> temp = (1,)
>>> type(temp)
    <class 'tuple'>


>>> temp = (1)
>>> type(temp)
    <class 'int'>


>>> 8 * (8)
    64
>>> 8 * (8,)
    (8, 8, 8, 8, 8, 8, 8, 8)

元組裡只有一個元素的時候,逗號(,)非常重要

2、更新和刪除元組

直接在同一個元組上更新是不可行的,但是可以通過拷貝現有的元組片段構造一個新的元組的方式解決。
通過分片的方法讓元組拆分成兩部分,然後再使用連線操作符(+)合併成一個新元組,最後將原來的變數名(temp)指向連線好的新元組。在這裡就要注意了,逗號是必須的,小括號也是必須的!

__author__ = 'Administrator'

# -*- coding:utf-8 -*-

temp = ("龍貓","泰迪","叮噹貓")
temp = temp[:2] + ("小豬佩奇",)+temp[2:]
print(temp)
"""
('龍貓', '泰迪', '小豬佩奇', '叮噹貓')

Process finished with exit code 0
"""

刪除元組中的元素:對於元組是不可變的原則來說,單獨刪除一個元素是不可能的,當然你可以利用切片的方式更新元組,間接的刪除一個元素。

__author__ = 'Administrator'

# -*- coding:utf-8 -*-

temp = ('龍貓', '泰迪', '小豬佩奇', '叮噹貓')
temp = temp[:2] + temp[3:]
print(temp)
"""
('龍貓', '泰迪', '叮噹貓')

Process finished with exit code 0
"""

在日常中很少用del去刪除整個元組,因為Python的回收機制會在這個元組不再被使用的時候自動刪除。

__author__ = 'Administrator'

# -*- coding:utf-8 -*-

temp = ('龍貓', '泰迪', '小豬佩奇', '叮噹貓')
del temp
print(temp)
"""
Traceback (most recent call last):
  File "F:/python_progrom/test.py", line 7, in <module>
    print(temp)
NameError: name 'temp' is not defined

Process finished with exit code 0
"""

最後成員關係操作符 in 和 not in 也可以直接應用在元組上,這跟列表是一樣的。

__author__ = 'Administrator'

# -*- coding:utf-8 -*-

temp = ('龍貓', '泰迪', '小豬佩奇', '叮噹貓')
a ="泰迪"
c = ('泰迪', '小豬佩奇')
b = a in temp
d =c in temp
f =c not in temp
print(b)
print(d)
print(f)
"""
True
False
True

Process finished with exit code 0
"""