簡體   English   中英

Python:(1,2,3) 和 [1,2,3] 有什么區別,我應該在什么時候使用它們?

[英]Python: what is the difference between (1,2,3) and [1,2,3], and when should I use each?

在許多地方, (1,2,3) (元組)和[1,2,3] (列表)可以互換使用。

我什么時候應該使用其中之一,為什么?

來自Python 常見問題解答

列表和元組雖然在許多方面相似,但通常以根本不同的方式使用。 元組可以被認為類似於 Pascal 記錄或 C 結構體; 它們是相關數據的小集合,這些數據可能是作為一個組進行操作的不同類型。 例如,笛卡爾坐標適當地表示為兩個或三個數字的元組。

另一方面,列表更像是其他語言中的數組。 它們傾向於持有不同數量的對象,所有這些對象都具有相同的類型並且被一個一個地操作。

通常按照慣例,您不會僅根據其(不)可變性來選擇列表或元組。 您將為完全不同的數據片段的小集合選擇一個元組,其中成熟的類太重,並為任何合理大小的集合選擇一個列表,其中您擁有一組同構的數據。

列表[1,2,3]是動態且靈活的,但這種靈活性是以速度為代價的。

元組(1,2,3)是固定的(不可變的),因此速度更快。

元組是創建復合數據類型的一種快速\\靈活的方式。 列表是對象列表的容器。

例如,您可以使用 List 來存儲班級中學生詳細信息的列表。

該列表中的每個學生詳細信息可能是一個包含他們的卷號、姓名和考試成績的 3 元組。

`[(1,'Mark',86),(2,'John',34)...]`

此外,由於元組是不可變的,因此它們可以用作字典中的鍵。

元組的概念具有很強的表現力:

  • 實際上,它們非常適合打包和解包值 ( x,y=coord )。

  • 結合字典(哈希表),它們允許映射形式,否則需要許多級別的關聯。 例如,考慮標記 (x,y) 已找到。

     // PHP if (!isset($found[$x])) { $found[$x] = Array(); $found[$x][$y] = true; } else if (!isset($found[$x][$y])) { $found[$x][$y] = true; } # Python found[(x,y)] = True # parens added for clarity
  • 列表應該在預期對其內容進行操作的情況下使用(因此多次提到不變性)。 人們會想要使用列表彈出、推送、拼接、切片、搜索、之前插入、之后插入等。

  • 元組應該是對象的低級表示,在其中進行簡單的比較,或以可預測的方式提取第 n 個或 n 個元素等操作,例如前面給出的坐標示例。

  • 最后,列表是不可散列的,所以用字典(Perl 中的散列表,PHP 中的關聯數組)完成的映射類型必須用元組完成。

    這是元組和字典的簡單示例,最后一起:

     """ couple is a tuple of two people doesLike is a dictionary mapping couples to True or False """ couple = "john", "jane" doesLike = dict() doesLike[couple] = True doesLike["jane", "john"] = False # unrequited love :'(

[1, 2, 3]是一個列表,可以在其中添加或刪除項目。
(1, 2, 3)是一個元組,一旦定義就不能修改。

每當我需要將一組項目傳遞給函數時,如果我希望函數不更改傳入的值 - 我使用元組。

否則,如果我想擁有改變值的功能,我使用 list.

如果您使用外部庫並且需要將值列表傳遞給函數並且不確定數據的完整性,請始終使用元組。

打開控制台並運行python。 嘗試這個:

  >>> list = [1, 2, 3]     
  >>> dir(list)
    ['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__delsli
    ce__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getit
    em__', '__getslice__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__',
     '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__r
    educe__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__'
    , '__setitem__', '__setslice__', '__sizeof__', '__str__', '__subclasshook__', 
'append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']

正如您可能看到的最后一行列表中的最后一個有以下方法: 'append'、'count'、'extend'、'index'、'insert'、'pop'、'remove'、'reverse'、'sort '

現在對元組嘗試相同的方法:

>>> tuple = (1, 2, 3)
>>> dir(tuple)
    ['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__', '__
    format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__get
    slice__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__
    lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__'
    , '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'count', 'index']

此處僅顯示列表方法中的'count' 和 'index'

這是因為元組是不可變的,它們不支持任何修改。 相反,它們在內部實現中更簡單、更快。

  • 元組可能代表字典中的一個鍵,因為它是不可變的。
  • 如果您有一組不需要隨機訪問的數據,請使用列表。

正如其他人提到的,列表和元組都是可用於存儲 Python 對象的容器。 列表是可擴展的,它們的內容可以通過賦值來改變,另一方面,元組是不可變的。

此外,列表不能用作字典中的鍵,而元組可以。

[1,2,3]是一個列表。

(1,2,3)是一個元組並且不可變。

(1,2,3) 和 [1,2,3] 在罕見的情況下可以互換使用。

所以 (1,2,3) 是一個元組並且是不可變的。 您希望進行的任何更改都需要覆蓋該對象。

[1,2,3] 是一個列表,可以添加和刪除元素。

列表具有比元組更多的功能。

如果您能找到適用於元組的解決方案,請使用它們,因為它會強制不變性,從而使您走上更實用的道路。 你幾乎從不后悔走上功能/不可變的道路。

(1,2,3)是一個元組,而[1,2,3]是一個列表。 元組是不可變的對象,而列表是可變的。

(1,2,3)是一個元組, [1,2,3]是一個列表。 兩者中的任何一個都表示數字序列,但請注意元組是不可變的,列表是可變的 Python 對象。

(1,2,3)-tuple [1,2,3]-list 列表是可變的,可以對其執行各種操作,而元組是不可變的,不能擴展。我們不能一次從元組中添加、刪除或更新任何元素它被創建。

a = (1,2,3) 是一個元組,它是不可變的,這意味着你不能向 ab = [1,2,3] 中添加任何東西刪除或添加數字。

簡單來說,列表是可變的,而元組則不是。 因此,如果您想修改程序中的元素,即添加、刪除或更改元素,請查找列表。 但是,如果你不希望 tat 發生,即,可能是為了在 for 循環中設置序列,等等。去一個元組

(1,2,3)是不可變的,因此您不能向其中添加或更改其中一項。 相反, [1,2,3]是可變的,因此您可以向其中添加或更改項目。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM