2010-05-27 75 views

回答

10
  • list不僅僅是普通數組。您可以初始化它們而無需提供項目數量。你可以給他們append/push,你可以從他們的remove/pop/del項目,你可以有不同類型的對象列表(例如,[1,'e', [3]]),你可以有遞歸列表...你可以切片列表,這意味着只有少數項目獲得新的列表。
  • slice是一個對象類型,用於「幕後」處理a[start:stop:step]表單中的擴展切片,如help(slice)所示。

「序列」不是一個對象,更像是一個非正式的接口,一些對象如list實現。

+4

Python開發人員認爲否則:['list':一個內置的Python序列。儘管它的名字更接近於其他語言的數組,而不是鏈接列表,因爲對元素的訪問是'O(1)'。](http://docs.python.org/py3k/glossary.html#term-列表) – SilentGhost 2010-05-27 11:40:13

+1

也許更好的C++類比是std :: vector,除了異構。 – 2010-05-27 11:42:56

3
  • 列表是一個序列類型,類似於陣列

  • 序列類型描述的功能性超集:

有六種序列類型:字符串, Unicode字符串,列表,元組,緩衝區和xrange對象。

  • 是子陣列的符號(或子也)

更多... http://docs.python.org/glossary.html

2

嚴格地說,切片是這樣一種類型,代表一系列指數,例如一個開始,一個停止和一個步驟。切片根本不是容器類型。您可以使用切片對列表編制索引,從而生成新列表,該列表是原始列表的子列表的副本。

列表與C++數組的不同之處在於它們是異構的;這些元素不需要具有相同的類型。正如MYYN已經指出的,「序列」根本不是Python類型,而是對各種內置類型的描述。

5

列表是一個序列,但一個序列不一定是一個列表。序列是支持序列接口(「協議」)的任何類型。這是通過鴨式打印而不是通過嚴格的繼承層次來完成的。請注意,序列是容器,但容器不一定是序列。 (序列很好,順序!)

參見http://docs.python.org/library/stdtypes.html#sequence-types-str-unicode-list-tuple-buffer-xrange

切片對象通常創建經由語法糖(foo[2:5])和隱式地提供給容器類型特殊的方法(如__getitem__),它可以重寫。除非創建自己的序列/容器,否則通常不需要處理切片。

參見http://docs.python.org/reference/datamodel.html#specialnames

解釋比得上陣列。我不確定,但我認爲它是用cPython作爲動態擴展數組來實現的。但是,該接口使它更像C++ STL向量,而不僅僅是一個普通的舊數組。

33

你在你的問題很混合不同的東西,所以我就回答不同的問題;-P

你現在問在Python中最重要的接口之一:iterable - 它基本上是什麼您可以使用像for elem in iterable

iterable有三個後代:sequencegeneratormapping

  • 序列是一個迭代用隨機訪問。您可以要求任何項目的順序,而不必消耗它之前的項目。有了這個屬性,你可以建立slices,它一次給你多個元素。一個切片可以給你一個子序列:seq[from:until]和每第n個項目:seq[from:until:nth]list,tuplestr都是序列。

  • 如果訪問是通過鍵而不是整數位置完成的,則您有一個映射dict是基本的映射。

  • 最基本的迭代是生成器。它不支持隨機訪問,因此不支持切片。您必須按照給定的順序使用所有項目。生成器通常只在您迭代它們時才創建它們的項目。創建generators的常用方法是生成器表達式。除了圓括號外,它們看起來完全像列表理解,例如(f(x) for x in y)。調用使用yield關鍵字的函數也會返回一個生成器。

常見的適配器所有iterables是迭代iterators與它們支持的最基本類型具有相同的接口,generator。它們是通過在迭代器上調用iter來顯式創建的,並且隱式地用於各種循環結構中。

+0

我喜歡這個答案中提到的發電機。想想「懶」和「無限」。 – Donald 2018-02-10 10:43:55

相關問題