这些内置Python数据类型之间有什么区别: list , sequence 和 slice ?在我看来,这三者基本上代表了C ++和Java所谓的 array 。
答案 0 :(得分:41)
你在问题中混合了非常不同的东西,所以我只回答一个不同的问题;-P
您现在正在询问Python中最重要的界面之一:iterable
- 它基本上是您可以使用的任何内容,如for elem in iterable
。
iterable
有三个后代:sequence
,generator
和mapping
。
序列是具有随机访问权限的可迭代。您可以询问序列中的任何项目,而无需使用之前的项目。使用此属性,您可以构建slices
,它可以同时为您提供多个元素。切片可以为您提供一个子序列:seq[from:until]
和每个第n项:seq[from:until:nth]
。 list
,tuple
和str
都是序列。
如果通过键而不是整数位置进行访问,则您有映射。 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对象。
答案 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类型,而是对各种内置类型的描述。