有什么不同?
元组/列表的优点/缺点是什么?
除了元组是不可变的之外,还有一个语义上的区别应该指导它们的使用.元组是异构数据结构(即,它们的条目具有不同的含义),而列表是同构序列.元组有结构,列表有顺序.
使用这种区别使代码更加明确和易懂.
一个例子是成对的页面和行号来引用书中的位置,例如:
my_location = (42, 11) # page number, line number
然后,您可以将其用作字典中的键来存储位置注释.另一方面,列表可用于存储多个位置.当然,人们可能希望在列表中添加或删除位置,因此列表是可变的是有意义的.另一方面,在现有位置添加或删除项目没有意义 - 因此元组是不可变的.
在某些情况下,您可能希望更改现有位置元组中的项目,例如在遍历页面行时.但元组不变性迫使您为每个新值创建一个新的位置元组.这看起来很不方便,但使用这样的不可变数据是价值类型和函数式编程技术的基石,它们具有很大的优势.
关于这个问题有一些有趣的文章,例如"Python元组不仅仅是常量列表"或"理解Python中的元组与列表".官方Python文档也提到了这一点
"元组是不可变的,通常包含异构序列......".
在像Haskell这样的静态类型语言中,元组中的值通常具有不同的类型,并且元组的长度必须是固定的.在列表中,值都具有相同的类型,并且长度不固定.所以差异非常明显.
最后在Python中有一个namedtuple,这是有道理的,因为元组已经被认为具有结构.这强调了元组是类和实例的轻量级替代品的想法.
列表和元组之间的区别
文字
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
可清洗的 元组是可以清洗而列表则不是.散列函数返回对象的散列值(如果有).
如果你去散步,你可以在(x,y)
元组的任何瞬间记下你的坐标.
如果您想记录您的旅程,您可以每隔几秒将您的位置附加到列表中.
但你不能反过来这样做.
关键的区别在于元组是不可变的.这意味着一旦创建了元组,就无法更改元组中的值.
因此,如果您需要更改值,请使用List.
对元组的好处:
性能略有提升.
由于元组是不可变的,因此它可以用作字典中的键.
如果你不能改变它既不可以别人,这是说你不需要担心任何API函数等,改变你的元组没有被要求.
列表是可变的; 元组不是.
来自docs.python.org/2/tutorial/datastructures.html
元组是不可变的,并且通常包含异构的元素序列,这些元素可以通过解包(参见本节后面部分)或索引(甚至是在namedtuples的情况下通过属性)来访问.列表是可变的,它们的元素通常是同类的,可以通过遍历列表来访问.
它被提及的差异主要语义:人们期待一个元组,并列出来代表不同的信息.但这比指南更进一步; 一些库实际上根据传递的内容表现不同.以NumPy为例(从我要求更多示例的另一篇文章中复制):
>>> import numpy as np >>> a = np.arange(9).reshape(3,3) >>> a array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]) >>> idx = (1,1) >>> a[idx] 4 >>> idx = [1,1] >>> a[idx] array([[3, 4, 5], [3, 4, 5]])
关键是,虽然NumPy可能不是标准库的一部分,但它是一个主要的 Python库,并且在NumPy列表和元组中是完全不同的东西.
列表用于循环,元组用于结构,即"%s %s" %tuple
.
列表通常是同类的,元组通常是异构的.
列表用于可变长度,元组用于固定长度.
这是Python列表的一个示例:
my_list = [0,1,2,3,4] top_rock_list = ["Bohemian Rhapsody","Kashmir","Sweet Emotion", "Fortunate Son"]
这是Python元组的一个例子:
my_tuple = (a,b,c,d,e) celebrity_tuple = ("John", "Wayne", 90210, "Actor", "Male", "Dead")
Python列表和元组是相似的,因为它们都是有序的值集合.除了使用括号"[...,...]"和使用括号"(...,...)"的元组创建列表的浅层差异之外,核心技术"Python语法中的硬编码"之间存在差异是特定元组的元素是不可变的,而列表是可变的(...所以只有元组是可以清除的,可以用作字典/散列键!).这导致了它们可以或不可以使用的方式(通过语法强制执行)和人们如何选择使用它们的差异(鼓励作为'最佳实践,'后验,这是聪明的程序员所做的).当使用元组与使用列表时区分后验的主要区别在于人们赋予元素顺序的意义.
对于元组,"顺序"仅表示用于保存信息的特定"结构".在第一个字段中找到的值可以很容易地切换到第二个字段,因为每个字段提供跨两个不同维度或比例的值.它们提供不同类型问题的答案,通常具有以下形式:对于给定的对象/主题,它的属性是什么?对象/主体保持不变,属性不同.
对于列表,"顺序"表示序列或方向性.第二个元素必须位于第一个元素之后,因为它基于特定和常见的比例或维度位于第二个位置.这些元素作为一个整体提供,并且主要提供表格的单个问题的答案,对于给定的属性,这些对象/主题如何比较?属性保持不变,对象/主题不同.
流行文化和程序员中有无数的例子不符合这些差异,并且有无数人可能会使用沙拉叉作为他们的主菜.在一天结束时,它很好,通常都可以完成工作.
总结一些更精细的细节
相似点:
重复 - 元组和列表都允许重复
索引,选择和切片 - 使用括号内的整数值对元组和列表进行索引.所以,如果你想要给定列表或元组的前3个值,语法将是相同的:
>>> my_list[0:3] [0,1,2] >>> my_tuple[0:3] [a,b,c]
比较和排序 - 两个元组或两个列表都通过它们的第一个元素进行比较,如果存在平局,则通过第二个元素进行比较,依此类推.在先前元素显示出差异之后,不再进一步关注后续元素.
>>> [0,2,0,0,0,0]>[0,0,0,0,0,500] True >>> (0,2,0,0,0,0)>(0,0,0,0,0,500) True
差异: - 根据定义,先验
语法 - 列表使用[],元组使用()
可变性 - 给定列表中的元素是可变的,给定元组中的元素是不可变的.
# Lists are mutable: >>> top_rock_list ['Bohemian Rhapsody', 'Kashmir', 'Sweet Emotion', 'Fortunate Son'] >>> top_rock_list[1] 'Kashmir' >>> top_rock_list[1] = "Stairway to Heaven" >>> top_rock_list ['Bohemian Rhapsody', 'Stairway to Heaven', 'Sweet Emotion', 'Fortunate Son'] # Tuples are NOT mutable: >>> celebrity_tuple ('John', 'Wayne', 90210, 'Actor', 'Male', 'Dead') >>> celebrity_tuple[5] 'Dead' >>> celebrity_tuple[5]="Alive" Traceback (most recent call last): File "", line 1, in TypeError: 'tuple' object does not support item assignment
Hashtables(字典) - 由于哈希表(字典)要求其键是可清除的,因此不可变,只有元组可以充当字典键,而不是列表.
#Lists CAN'T act as keys for hashtables(dictionaries) >>> my_dict = {[a,b,c]:"some value"} Traceback (most recent call last): File "", line 1, in TypeError: unhashable type: 'list' #Tuples CAN act as keys for hashtables(dictionaries) >>> my_dict = {("John","Wayne"): 90210} >>> my_dict {('John', 'Wayne'): 90210}
差异 - 后验,使用中
Homo与元素的异构性 - 通常列表对象是同质的,元组对象是异构的.也就是说,列表用于相同类型的对象/主题(如所有总统候选人,或所有歌曲,或所有参赛者),尽管它不是强制的,但是元组更多用于异类对象.
循环与结构 - 尽管两者都允许循环(对于my_list中的x ...),但只对列表进行循环才有意义.元组更适合于构造和呈现信息(%s%s居住在%s中是%s,目前%s%("John","Wayne",90210,"Actor","Dead"))
列表的值可以随时更改,但元组的值不能更改.
的优点和缺点取决于使用.如果你有这样的数据,你永远不想改变那么你应该使用元组,否则列表是最好的选择.
元组和列表在Python中看似相似的序列类型.
文字语法
我们使用括号() to construct tuples and square brackets
[ ]
以获得新列表.此外,我们可以使用适当类型的调用来获取所需的结构 - 元组或列表.
someTuple = (4,6) someList = [2,6]
可变性
元组是不可变的,而列表是可变的.这一点是以下几点的基础.
内存使用情况
由于可变性,您需要更多的内存用于列表,而更少的内存用于元组.
扩展
您可以向元组和列表添加新元素,唯一的区别是元组的id将被更改(即,我们将有一个新对象).
哈希
元组是可以清洗的,而列表则不是.这意味着您可以使用元组作为字典中的键.该列表不能用作字典中的键,而可以使用元组
tup = (1,2) list_ = [1,2] c = {tup : 1} # ok c = {list_ : 1} # error
语义
这一点更多的是关于最佳实践.您应该使用元组作为异构数据结构,而列表是同质序列.
列表旨在是同构序列,而元组是异构数据结构.
正如人们在这里已经回答的那样tuples
,虽然lists
可变但可变是不变的,但是使用元组有一个重要方面,我们必须记住
如果中tuple
包含一个list
或dictionary
内部,则即使它们tuple
本身是不可变的,也可以更改它们。
例如,假设我们有一个元组,其中包含一个列表和一个字典,如下所示
my_tuple = (10,20,30,[40,50],{ 'a' : 10})
我们可以将列表的内容更改为
my_tuple[3][0] = 400 my_tuple[3][1] = 500
这使得新的元组看起来像
(10, 20, 30, [400, 500], {'a': 10})
我们也可以将元组中的字典更改为
my_tuple[4]['a'] = 500
这将使整个元组看起来像
(10, 20, 30, [400, 500], {'a': 500})
发生这种情况是因为list
和dictionary
是对象,而这些对象并没有改变,而是其指向的内容。
因此,这些tuple
遗物毫无例外地保持不变