列表和元组之间有什么区别?
元组/列表之间有什么区别,它们的优点/缺点是什么?
除了元组是不可变的之外,还有一个语义上的区别,应该指导它们的使用。元组是异构数据结构(即,它们的条目具有不同的含义),而列表是同构序列。元组有结构,列表有序。
使用这种区别使代码更加明确和易于理解。
一个例子是一对页码和行号来引用书中的位置,例如:
my_location = (42, 11) # page number, line number
然后,您可以将其用作字典中的键来存储位置上的注释。另一方面,列表可用于存储多个位置。当然,您可能希望在列表中添加或删除位置,因此列表是可变的。另一方面,在现有位置添加或删除项目没有意义 - 因此元组是不可变的。
在某些情况下,您可能希望更改现有位置元组中的项,例如,在循环访问页面的行时。但是,元组不可变性会强制您为每个新值创建新的位置元组。从表面上看,这似乎不方便,但是像这样使用不可变数据是价值类型和函数式编程技术的基石,这可能具有实质性的优势。
关于这个问题有一些有趣的文章,例如“Python元组不仅仅是常量列表”或“理解Python中的元组与列表”。官方的Python文档也提到了这一点。
“元组是不可变的,通常包含异构序列......”。
在像Haskell这样的静态类型语言中,元组中的值通常具有不同的类型,并且元组的长度必须是固定的。在列表中,所有值都具有相同的类型,并且长度不固定。所以区别非常明显。
最后是Python中的nametuple,这是有道理的,因为元组已经应该具有结构。这强调了元组是类和实例的轻量级替代方案的想法。
列表和元组之间的区别
字面
someTuple = (1,2)
someList = [1,2]
大小
a = tuple(range(1000))
b = list(range(1000))
a.__sizeof__() # 8024
b.__sizeof__() # 9088
由于元组操作的大小较小,因此速度会更快一些,但在您拥有大量元素之前,无需提及太多。
允许的操作
b = [1,2]
b[0] = 3 # [3, 2]
a = (1,2)
a[0] = 3 # Error
这也意味着您无法删除元素或对元组进行排序。但是,您可以向列表和元组添加新元素,唯一的区别是,由于元组是不可变的,因此您实际上并没有添加元素,而是在创建新元组,因此 的 id 将更改
a = (1,2)
b = [1,2]
id(a) # 140230916716520
id(b) # 748527696
a += (3,) # (1, 2, 3)
b += [3] # [1, 2, 3]
id(a) # 140230916878160
id(b) # 748527696
用法
由于列表是可变的,因此它不能用作字典中的键,而元组则可以使用。
a = (1,2)
b = [1,2]
c = {a: 1} # OK
c = {b: 1} # Error