2010-05-27 147 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