元组/列表之间的区别是什么?它们的优点/缺点是什么?
当前回答
除了元组是不可变的之外,还有一个语义上的区别应该指导它们的使用。元组是异构数据结构(即,它们的条目有不同的含义),而列表是同构序列。元组有结构,列表有顺序。
使用这种区别可以使代码更加明确和易于理解。
一个例子是用页码和行号对来引用书中的位置,例如:
my_location = (42, 11) # page number, line number
然后,您可以使用它作为字典中的键来存储关于位置的注释。另一方面,列表可用于存储多个位置。自然,人们可能想要从列表中添加或删除位置,所以列表是可变的是有道理的。另一方面,从现有位置添加或删除项没有意义——因此元组是不可变的。
在某些情况下,您可能希望更改现有位置元组中的项,例如在遍历页面的行时。但是元组不可变性迫使您为每个新值创建一个新的位置元组。从表面上看,这似乎不太方便,但像这样使用不可变数据是值类型和函数式编程技术的基础,具有很大的优势。
关于这个问题有一些有趣的文章。“Python元组不仅仅是常量列表”或“理解Python中的元组与列表”。Python官方文档也提到了这一点
元组是不可变的,通常包含异构序列…
在像Haskell这样的静态类型语言中,元组中的值通常具有不同的类型,并且元组的长度必须是固定的。在列表中,所有值都具有相同的类型,长度也不是固定的。所以区别非常明显。
最后是Python中的namedtuple,这是有意义的,因为tuple已经被认为具有结构。这强调了元组是类和实例的轻量级替代品的观点。
其他回答
换句话说,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)
]
列表是可变的,元组是不可变的。 考虑一下这个例子。
a = ["1", "2", "ra", "sa"] #list
b = ("1", "2", "ra", "sa") #tuple
现在改变list和tuple的索引值。
a[2] = 1000
print a #output : ['1', '2', 1000, 'sa']
b[2] = 1000
print b #output : TypeError: 'tuple' object does not support item assignment.
因此证明下面的代码是无效的元组,因为我们试图更新一个元组,这是不允许的。
正如人们已经在这里回答的那样,元组是不可变的,而列表是可变的,但是使用元组有一个重要的方面我们必须记住
如果元组中包含列表或字典,即使元组本身是不可变的,也可以更改这些列表或字典。
例如,假设我们有一个元组,其中包含一个列表和一个字典为
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是对象,这些对象没有改变,但它所指向的内容。
因此,元组保持不变,没有任何异常
最重要的区别是时间!当你不想改变列表里面的数据时最好使用元组!下面是为什么使用tuple的例子!
import timeit
print(timeit.timeit(stmt='[1,2,3,4,5,6,7,8,9,10]', number=1000000)) #created list
print(timeit.timeit(stmt='(1,2,3,4,5,6,7,8,9,10)', number=1000000)) # created tuple
在本例中,我们执行了这两条语句100万次
输出:
0.136621
0.013722200000000018
任何人都能清楚地注意到时差。
列表是可变的;元组不是。
从docs.python.org/2/tutorial/datastructures.html
元组是不可变的,通常包含的异构序列 通过解包访问的元素(参见本节后面的内容) 或者索引(在命名元组的情况下甚至通过属性)。列表 是可变的,它们的元素通常是同质的和 通过遍历列表来访问。
推荐文章
- 证书验证失败:无法获得本地颁发者证书
- 当使用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中获得所有直接子目录