这些内置 Python 数据类型之间有什么区别:list、sequence和slice?正如我所看到的,这三个本质上都代表了 C++ 和 Java 所称的数组。
5 回答
你在你的问题中混合了非常不同的东西,所以我会回答一个不同的问题
您现在正在询问 Python 中最重要的接口之一:iterable
- 它基本上是您可以使用的任何东西,例如for elem in iterable
.
iterable
有三个后代sequence
:generator
和mapping
。
序列是随机访问的可迭代对象。您可以要求序列中的任何项目,而不必消耗它之前的项目。使用此属性,您可以 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
可迭代对象显式创建的,并在各种循环结构中隐式使用。
list
不仅仅是普通的数组。您可以在不提供项目数量的情况下初始化它们。你可以append
/push
对他们,你可以remove
//他们的项目pop
,del
你可以有不同类型的对象的列表(例如,[1,'e', [3]]
),你可以有递归列表......你可以切片列表,这意味着得到一个新的列表只有一些项目。slice
正如所揭示的那样,是一种用于“在幕后”处理a[start:stop:step]
表单中扩展切片的对象类型。help(slice)
“序列”不是一个对象,更像是一些对象之类的list
实现的非正式接口。
列表是一种序列类型,类似于数组
序列类型描述了一个功能超集:
有六种序列类型:字符串、Unicode 字符串、列表、元组、缓冲区和 xrange 对象。
- 切片是子数组(或子字符串)的符号
列表是序列,但序列不一定是列表。序列是支持序列接口(“协议”)的任何类型。这是通过鸭子类型而不是通过严格的继承层次结构来完成的。请注意,序列是容器,但容器不一定是序列。(顺序是,嗯,顺序!)
请参阅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 向量,而不仅仅是一个普通的旧数组。
严格来说,切片是一种表示索引范围的类型,例如开始、停止和步长。切片根本不是容器类型。您可以使用切片来索引列表,从而生成一个新列表,该列表是原始列表的子列表的副本。
列表与 C++ 数组的不同之处在于它们是异构的。这些元素不需要是同一类型。而且正如 MYYN 已经指出的,“序列”根本不是 Python 类型,而是对各种内置类型的描述。