元组/列表之间的区别是什么?它们的优点/缺点是什么?
当前回答
从5.3的文档中引证的方向。元组和序列:
虽然元组可能看起来类似于列表,但它们通常用于不同的情况和不同的目的。元组是不可变的,通常包含不同的元素序列,可以通过解包(参见本节后面的内容)或索引(对于namedtuples,甚至可以通过属性访问)访问这些元素。列表是可变的,它们的元素通常是同构的,并通过遍历列表来访问。
其他回答
除了元组是不可变的之外,还有一个语义上的区别应该指导它们的使用。元组是异构数据结构(即,它们的条目有不同的含义),而列表是同构序列。元组有结构,列表有顺序。
使用这种区别可以使代码更加明确和易于理解。
一个例子是用页码和行号对来引用书中的位置,例如:
my_location = (42, 11) # page number, line number
然后,您可以使用它作为字典中的键来存储关于位置的注释。另一方面,列表可用于存储多个位置。自然,人们可能想要从列表中添加或删除位置,所以列表是可变的是有道理的。另一方面,从现有位置添加或删除项没有意义——因此元组是不可变的。
在某些情况下,您可能希望更改现有位置元组中的项,例如在遍历页面的行时。但是元组不可变性迫使您为每个新值创建一个新的位置元组。从表面上看,这似乎不太方便,但像这样使用不可变数据是值类型和函数式编程技术的基础,具有很大的优势。
关于这个问题有一些有趣的文章。“Python元组不仅仅是常量列表”或“理解Python中的元组与列表”。Python官方文档也提到了这一点
元组是不可变的,通常包含异构序列…
在像Haskell这样的静态类型语言中,元组中的值通常具有不同的类型,并且元组的长度必须是固定的。在列表中,所有值都具有相同的类型,长度也不是固定的。所以区别非常明显。
最后是Python中的namedtuple,这是有意义的,因为tuple已经被认为具有结构。这强调了元组是类和实例的轻量级替代品的观点。
列表是同构序列,而元组是异构数据结构。
首先,它们都是Python中的非标量对象(也称为复合对象)。
元组,有序的元素序列(可以包含任何没有混叠问题的对象) 不可变(tuple, int, float, str) 使用+进行连接(当然会创建一个全新的元组) 索引 切片 Singleton(3,) # ->(3)而不是(3)# -> 3 List(其他语言中的数组),值的有序序列 可变的 单例[3] 克隆new_array = origin_array[:] 列表推导式[x**2 for x in range(1,7)]给出 [1,4,9,16,25,36](不可读)
使用list还可能导致别名错误(两条不同的路径 指向同一对象)。
正如人们已经在这里回答的那样,元组是不可变的,而列表是可变的,但是使用元组有一个重要的方面我们必须记住
如果元组中包含列表或字典,即使元组本身是不可变的,也可以更改这些列表或字典。
例如,假设我们有一个元组,其中包含一个列表和一个字典为
my_tuple = (10,20,30,[40,50],{ 'a' : 10})
我们可以将列表的内容更改为
my_tuple[3][0] = 400
my_tuple[3][1] = 500
new tuple看起来像什么
(10, 20, 30, [400, 500], {'a': 10})
我们还可以更改tuple as内的字典
my_tuple[4]['a'] = 500
这将使整个元组看起来像
(10, 20, 30, [400, 500], {'a': 500})
发生这种情况是因为list和dictionary是对象,这些对象没有改变,但它所指向的内容。
因此,元组保持不变,没有任何异常
列表用于循环,元组用于结构。“%s %s”%元组。
列表通常是同构的,元组通常是异构的。
列表是可变长度的,元组是固定长度的。
推荐文章
- 证书验证失败:无法获得本地颁发者证书
- 当使用pip3安装包时,“Python中的ssl模块不可用”
- 无法切换Python与pyenv
- Python if not == vs if !=
- 如何从scikit-learn决策树中提取决策规则?
- 为什么在Mac OS X v10.9 (Mavericks)的终端中apt-get功能不起作用?
- 将旋转的xtick标签与各自的xtick对齐
- 为什么元组可以包含可变项?
- 如何合并字典的字典?
- 如何创建类属性?
- 不区分大小写的“in”
- 在Python中获取迭代器中的元素个数
- 解析日期字符串并更改格式
- 使用try和。Python中的if
- 如何在Python中获得所有直接子目录