元组/列表之间的区别是什么?它们的优点/缺点是什么?


当前回答

列表是可变的。而元组是不可变的。在元组中访问带有索引的偏移量元素比在列表中更有意义,因为元素及其索引不能被更改。

其他回答

换句话说,TUPLES用于存储一组元素,其中组的内容/成员不会改变,而list用于存储一组元素,其中组的成员可以改变。

例如,如果我想在一个变量中存储我的网络IP,最好使用一个元组,因为IP是固定的。my_ip =('192.168.0.15', 33,60)。但是,如果我想存储一组未来6个月我将访问的地方的IP,那么我应该使用LIST,因为我会不断更新和添加新的IP到组中。像这样

places_to_visit = [
    ('192.168.0.15', 33, 60), 
    ('192.168.0.22', 34, 60), 
    ('192.168.0.1', 34, 60), 
    ('192.168.0.2', 34, 60), 
    ('192.168.0.8', 34, 60), 
    ('192.168.0.11', 34, 60)
] 

如果你去散步,你可以随时在(x,y)元组中记下你的坐标。

如果你想记录你的旅程,你可以每隔几秒钟将你的位置添加到一个列表中。

但你不能反过来做。

除了元组是不可变的之外,还有一个语义上的区别应该指导它们的使用。元组是异构数据结构(即,它们的条目有不同的含义),而列表是同构序列。元组有结构,列表有顺序。

使用这种区别可以使代码更加明确和易于理解。

一个例子是用页码和行号对来引用书中的位置,例如:

my_location = (42, 11)  # page number, line number

然后,您可以使用它作为字典中的键来存储关于位置的注释。另一方面,列表可用于存储多个位置。自然,人们可能想要从列表中添加或删除位置,所以列表是可变的是有道理的。另一方面,从现有位置添加或删除项没有意义——因此元组是不可变的。

在某些情况下,您可能希望更改现有位置元组中的项,例如在遍历页面的行时。但是元组不可变性迫使您为每个新值创建一个新的位置元组。从表面上看,这似乎不太方便,但像这样使用不可变数据是值类型和函数式编程技术的基础,具有很大的优势。

关于这个问题有一些有趣的文章。“Python元组不仅仅是常量列表”或“理解Python中的元组与列表”。Python官方文档也提到了这一点

元组是不可变的,通常包含异构序列…

在像Haskell这样的静态类型语言中,元组中的值通常具有不同的类型,并且元组的长度必须是固定的。在列表中,所有值都具有相同的类型,长度也不是固定的。所以区别非常明显。

最后是Python中的namedtuple,这是有意义的,因为tuple已经被认为具有结构。这强调了元组是类和实例的轻量级替代品的观点。

从5.3的文档中引证的方向。元组和序列:

虽然元组可能看起来类似于列表,但它们通常用于不同的情况和不同的目的。元组是不可变的,通常包含不同的元素序列,可以通过解包(参见本节后面的内容)或索引(对于namedtuples,甚至可以通过属性访问)访问这些元素。列表是可变的,它们的元素通常是同构的,并通过遍历列表来访问。

list和tuple的区别

Literal someTuple = (1,2) someList = [1,2] Size a = tuple(range(1000)) b = list(range(1000)) a.__sizeof__() # 8024 b.__sizeof__() # 9088 Due to the smaller size of a tuple operation, it becomes a bit faster, but not that much to mention about until you have a huge number of elements. Permitted operations b = [1,2] b[0] = 3 # [3, 2] a = (1,2) a[0] = 3 # Error That also means that you can't delete an element or sort a tuple. However, you could add a new element to both list and tuple with the only difference that since the tuple is immutable, you are not really adding an element but you are creating a new tuple, so the id of will change 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 Usage As a list is mutable, it can't be used as a key in a dictionary, whereas a tuple can be used. a = (1,2) b = [1,2] c = {a: 1} # OK c = {b: 1} # Error