引言
Python,是一種廣泛應用于數據科學、機器學習等領域的高級編程語言,支持多種豐富多樣的數據類型,其中包括列表和元組。盡管這兩種數據結構都可用于存儲多個值,但它們在功能和特性上存在著明顯的差異。在接下來的博客中,我們將深入探討Python列表和元組的異同點,幫助你更好地理解和使用這兩種數據結構。
列表和元組的定義
列表可以視為一個有序的元素集合,它支持包含各種類型的對象,例如整數、字符串,甚至可以包含其他列表。在Python中,列表使用方括號[]
來表示,元素之間用逗號,
進行分隔。
示例代碼
# 構建列表,包含整數對象、元組對象、字符串對象、列表對象、字典對象
my_list = [1, (2,), 'three', [4, 5]]
for element in my_list:# 打印元素的數據類型print(type(element), end="\t")
# 輸出
<class 'int'> <class 'tuple'> <class 'str'> <class 'list'> <class 'dict'>
元組也是一個有序的集合,同樣可以包含任意類型的對象,包括數字、字符串、甚至其他元組。元組使用圓括號()
來表示,其中的元素用逗號,
分隔。例如:
# 構建元組,包含整數對象、列表對象、字符串對象、元組對象
my_tuple = (1, [2], 'three', (4, 5))
for element in my_tuple:# 打印元素的數據類型print(type(element), end="\t")
# 輸出
<class 'int'> <class 'list'> <class 'str'> <class 'tuple'>
列表和元組的相同點
-
都可以通過索引訪問元素:列表和元組都包含一組有序的元素 ? 可以通過索引訪問每個元素
-
數據類型多樣化:列表和元組都可以同時包含多種類型的對象,例如整數、浮點數、字符串、布爾值,甚至還可以包含列表或元組本身
示例代碼:
list1 = [1, (2,), 'three', [4, 5], {6: 7}]
tuple1 = (1, [2], 'three', (4, 5))
# 輸出列表list1的第2個元素和最后一個元素
print("{} | {}".format(list1[1], list1[-1]))
# (2,) | {6: 7}# 輸出列表tuple1的第2個元素和最后一個元素
print("{} | {}".format(tuple1[1], tuple1[-1]))
# [2] | (4, 5)
- 都支持切片操作:列表和元組都支持切片操作,可以通過切片獲取子序列。
示例代碼:
list1 = [1, (2,), 'three', [4, 5], {6: 7}]
tuple1 = (1, [2], 'three', (4, 5))# 通過切片操作將列表list1分成兩個子列表
print("{} | {}".format(list1[:3], list1[3:]))
# [1, (2,), 'three'] | [[4, 5], {6: 7}]# 通過切片操作將元組tuple1分成兩個子元組
print("{} | {}".format(tuple1[:3], tuple1[3:]))
# (1, [2], 'three') | ((4, 5),)
- 都是可迭代對象:列表和元組都是可迭代的,可以通過循環遍歷它們的元素。
示例代碼
list1 = [1, (2,), 'three', [4, 5], {6: 7}]
tuple1 = (1, [2], 'three', (4, 5))for i, element in enumerate(list1):print("列表list1的第{}個元素是:\t{}".format(i+1, element))
# 列表list1的第1個元素是: 1
# 列表list1的第2個元素是: (2,)
# 列表list1的第3個元素是: three
# 列表list1的第4個元素是: [4, 5]
# 列表list1的第5個元素是: {6: 7}for i, element in enumerate(tuple1):print("元組tuple1的第{}個元素是:\t{}".format(i + 1, element))
# 元組tuple1的第1個元素是: 1
# 元組tuple1的第2個元素是: [2]
# 元組tuple1的第3個元素是: three
# 元組tuple1的第4個元素是: (4, 5)
- 都支持連接操作:列表可以通過
+
操作符和另一個列表連接組成新列表;元組也可以通過+
操作符和另一個元組連接組成新元組。
示例代碼:
list1 = [1, (2,), 'three', [4, 5], {6: 7}]
list2 = [8, "9", (10,)]
tuple1 = (1, [2], 'three', (4, 5))
tuple2 = ("six", 7)print(list1 + list2)
# [1, (2,), 'three', [4, 5], {6: 7}, 8, '9', (10,)]
print(tuple1 + tuple2)
# (1, [2], 'three', (4, 5), 'six', 7)
- 都支持重復操作:列表和元組都支持使用
*
操作符對其本身進行復制操作。
示例代碼
list3 = ["+"]
print(list3 * 10)
# ['+', '+', '+', '+', '+', '+', '+', '+', '+', '+']tuple3 = ("+",)
print(tuple3 * 10)
# ('+', '+', '+', '+', '+', '+', '+', '+', '+', '+')
- 都支持成員檢測:列表和元組都支持使用
in
關鍵字檢測一個元素是否存在于列表或元組中
示例代碼
list1 = [1, (2,), 'three', [4, 5], {6: 7}]
print([4, 5] in list1) # True
print({6: 8} in list1) # Falsetuple1 = (1, [2], 'three', (4, 5))
print([2] in tuple1) # True
print(2 in tuple1) # False
- 都支持長度查詢:列表和元組都支持使用內置函數len()來查詢它們的長度(元素個數)
示例代碼
list1 = [1, (2,), 'three', [4, 5], {6: 7}]
print(len(list1) # 5tuple1 = (1, [2], 'three', (4, 5))
print(len(tuple1) # 4
- 都支持元素賦值:
- 對于列表,可以通過索引操作修改對應元素;
- 對于元組,雖然元組本身不可變,但可以修改元組中的可變元素(例如列表);
示例代碼
list1 = [1, (2,), 'three', [4, 5], {6: 7}]
print("列表list1修改前", list1)
list1[0] = "1"
print("列表list1修改后", list1)
# 列表list1修改前 [1, (2,), 'three', [4, 5], {6: 7}]
# 列表list1修改后 ['1', (2,), 'three', [4, 5], {6: 7}]tuple1 = (1, [2, 3], 'three', (4, 5))
print("元組tuple1修改前", tuple1)
# tuple1[1] = 3 會引發錯誤,因為元組是不可變的
tuple1[1][0] = 3 # 可以修改元組中的列表元素
print("元組tuple1修改后", tuple1)
# 元組tuple1修改前 (1, [2, 3], 'three', (4, 5))
# 元組tuple1修改后 (1, [3, 3], 'three', (4, 5))
- 都支持比較操作:列表和元組都支持使用比較操作符(例如==,!=,<,<=,>,>=)來進行元素比較。比較操作按照元素的順序進行。
list2 = [8, "9", (10,)]
tuple2 = ("six", 7)
print(list2 == [8, "9", (10,)]) # True
print(tuple2 == ("six", 7)) # True
print(list2 == ["8", "9", (10,)]) # False
print(tuple2 == ("six", "7")) # Falseprint(list2 != [8, "9", (10,)]) # False
print(tuple2 != ("six", 7)) # False
print(list2 != ["8", "9", (10,)]) # True
print(tuple2 != ("six", "7")) # True
列表和元組的不同點
- 列表是可變的,而元組是不可變的 ? 元組一旦創建,就不能通過索引修改它的元素,但可以修改元組中的可變元素。而列表創建后可以添加、刪除或更改其元素。
示例代碼
list1 = [1, 2, 3]
list1.append(4) # 添加元素4到列表末尾
print(list1) # [1, 2, 3, 4]tuple1 = (1, 2, 3, [4, 5])
# tuple1[0] = 5 # 這會引發錯誤,因為元組是不可變的
tuple1[3][0] = 5 # 可以運行,因為元組最后一個元素是列表,列表可以修改元素
print(tuple1) # (1, 2, 3, [5, 5])
-
語法:列表使用方括號
[]
來表示,而元組使用圓括號()
來表示。 -
方法:列表有更多的內置方法,例如append(), extend(), insert(), remove(), pop()等。元組的方法較少,常用的有count()和index()。
-
內存占用:由于元組是不可變的,它們通常比列表占用的內存空間要少。在處理大量數據時,元組的速度通常比列表快。
示例代碼
import sys# 創建大量數據
list_data = [0] * 100000000
tuple_data = (0,) * 100000000# 打印初始內存使用情況
print("初始內存使用情況(MB):")
print(sys.getsizeof(list_data) / 1024 / 1024) # 以MB為單位
print(sys.getsizeof(tuple_data) / 1024 / 1024) # 以MB為單位# 執行一些操作以查看內存使用情況
list_data.append(1)
tuple_data += (1,)# 打印操作后的內存使用情況(增加的內存用于存儲新添加的元素)
print("添加元素后的內存使用情況(MB):")
print("列表", sys.getsizeof(list_data) / 1024 / 1024) # 以MB為單位
print("元組", sys.getsizeof(tuple_data) / 1024 / 1024) # 以MB為單位# 運行結果
# 初始內存使用情況(MB):
# 762.9395065307617
# 762.9394912719727
# 添加元素后的內存使用情況(MB):
# 列表 858.3069686889648
# 元組 762.9394989013672
- 列表不可作為字典的鍵,而元組可以。
示例代碼
# 使用元組作為字典的鍵
dict_with_tuple_key = {(1, 2): 'value'}
print(dict_with_tuple_key[(1, 2)]) # 輸出:'value'# 使用列表作為字典的鍵(這會引發錯誤,因為列表是可變的)
dict_with_list_key = {[1, 2]: 'value'} # 報錯
- 使用場景:列表適用于存儲可變數量的、可變的數據,例如一個用戶的任務列表。元組則適用于存儲固定數量的、不可變的數據,例如日期、時間、常量等。
- 安全性:由于元組的不可變性,因此元組往往比列表更安全,在注重數據安全性的場景下,可以優先考慮使用元組。
結束語
未來如果想到更多列表和元組的異同點,會及時更新~
如果本博文對你有所幫助/啟發,可以點個贊/收藏支持一下,如果能夠持續關注,小編感激不盡~
如果有相關需求/問題需要小編幫助,歡迎私信~
小編會堅持創作,持續優化博文質量,給讀者帶來更好de閱讀體驗~