35

这些内置 Python 数据类型之间有什么区别:listsequenceslice?正如我所看到的,这三个本质上都代表了 C++ 和 Java 所称的数组

4

5 回答 5

71

你在你的问题中混合了非常不同的东西,所以我会回答一个不同的问题

您现在正在询问 Python 中最重要的接口之一:iterable- 它基本上是您可以使用的任何东西,例如for elem in iterable.

iterable有三个后代sequencegeneratormapping

  • 序列是随机访问的可迭代对象。您可以要求序列中的任何项目,而不必消耗它之前的项目。使用此属性,您可以 build slices,一次为您提供多个元素。切片可以给你一个 subsequence:seq[from:until]和每第 n 个 item: seq[from:until:nth]list,tuple都是str序列。

  • 如果访问是通过键而不是整数位置完成的,则您有一个映射dict是基本映射。

  • 最基本的可迭代对象是生成器。它不支持随机访问,因此不支持切片。您必须按照给定的顺序消耗所有物品。生成器通常仅在您迭代它们时创建它们的项目。创建的常用方法generators是生成器表达式。它们看起来与列表推导式完全一样,除了带有圆括号,例如(f(x) for x in y). 调用使用yield关键字的函数也会返回一个生成器。

所有可迭代对象的通用适配器是迭代器iterators具有与它们支持的最基本类型相同的接口,a generator。它们是通过调用iter可迭代对象显式创建的,并在各种循环结构中隐式使用。

于 2010-05-27T13:23:09.727 回答
15
  • list不仅仅是普通的数组。您可以在不提供项目数量的情况下初始化它们。你可以append/push对他们,你可以remove//他们的项目popdel你可以有不同类型的对象的列表(例如,[1,'e', [3]]),你可以有递归列表......你可以切片列表,这意味着得到一个新的列表只有一些项目。
  • slice正如所揭示的那样,是一种用于“在幕后”处理a[start:stop:step]表单中扩展切片的对象类型。help(slice)

“序列”不是一个对象,更像是一些对象之类的list实现的非正式接口。

于 2010-05-27T11:37:39.237 回答
7
  • 列表是一种序列类型,类似于数组

  • 序列类型描述了一个功能超集:

有六种序列类型:字符串、Unicode 字符串、列表、元组、缓冲区和 xrange 对象。

  • 切片是子数组(或子字符串)的符号

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

于 2010-05-27T11:28:09.067 回答
7

列表是序列,但序列不一定是列表。序列是支持序列接口(“协议”)的任何类型。这是通过鸭子类型而不是通过严格的继承层次结构来完成的。请注意,序列是容器,但容器不一定是序列。(顺序是,嗯,顺序!)

请参阅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 向量,而不仅仅是一个普通的旧数组。

于 2010-05-27T11:52:40.890 回答
2

严格来说,切片是一种表示索引范围的类型,例如开始、停止和步长。切片根本不是容器类型。您可以使用切片来索引列表,从而生成一个新列表,该列表是原始列表的子列表的副本。

列表与 C++ 数组的不同之处在于它们是异构的。这些元素不需要是同一类型。而且正如 MYYN 已经指出的,“序列”根本不是 Python 类型,而是对各种内置类型的描述。

于 2010-05-27T11:36:09.047 回答