Python中列表,序列和切片之间的区别?

时间:2010-05-27 11:24:53

标签: python list definition sequence slice

这些内置Python数据类型之间有什么区别: list sequence slice ?在我看来,这三者基本上代表了C ++和Java所谓的 array

5 个答案:

答案 0 :(得分:41)

你在问题​​中混合了非常不同的东西,所以我只回答一个不同的问题;-P

您现在正在询问Python中最重要的界面之一:iterable - 它基本上是您可以使用的任何内容,如for elem in iterable

iterable有三个后代:sequencegeneratormapping

  • 序列是具有随机访问权限的可迭代。您可以询问序列中的任何项目,而无需使用之前的项目。使用此属性,您可以构建slices,它可以同时为您提供多个元素。切片可以为您提供一个子序列:seq[from:until]和每个第n项:seq[from:until:nth]listtuplestr都是序列。

  • 如果通过键而不是整数位置进行访问,则您有映射dict是基本映射。

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

所有可迭代的通用适配器是迭代器iterators具有与其支持的最基本类型相同的界面,generator。它们是通过在iterable上调用iter显式创建的,并在所有类型的循环结构中隐式使用。

答案 1 :(得分:11)

  • list不仅仅是普通数组。您可以在不提供项目数量的情况下初始化它们。您可append / push向他们发送remove / pop / del项,您可以拥有不同类型对象的列表(例如,[1,'e', [3]]),你可以有递归列表......你可以对列表进行切片,这意味着只需要几个项目就可以获得一个新列表。
  • slice是“幕后”用于处理a[start:stop:step]表单中的扩展切片的对象类型,help(slice)显示。

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

答案 2 :(得分:5)

  • 列表是序列类型,类似于数组

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

  

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

  • 切片是子数组(或子串)的表示法

了解详情... http://docs.python.org/glossary.html

答案 3 :(得分:5)

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

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

答案 4 :(得分:2)

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

列表与C ++阵列的不同之处在于它们是异质的;元素不需要是相同类型。正如MYYN已经指出的那样,“序列”根本不是Python类型,而是对各种内置类型的描述。