元组/列表之间的区别是什么?它们的优点/缺点是什么?
当前回答
只是一个快速扩展列表vs元组响应:
由于动态特性,list分配的位桶比实际需要的内存要多。这样做是为了防止在将来附加额外项时进行昂贵的重新分配操作。 另一方面,由于是静态的,轻量级元组对象不需要保留存储它们所需的额外内存。
其他回答
列表是可变的,元组是不可变的。 考虑一下这个例子。
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.
因此证明下面的代码是无效的元组,因为我们试图更新一个元组,这是不允许的。
列表是可变的;元组不是。
从docs.python.org/2/tutorial/datastructures.html
元组是不可变的,通常包含的异构序列 通过解包访问的元素(参见本节后面的内容) 或者索引(在命名元组的情况下甚至通过属性)。列表 是可变的,它们的元素通常是同质的和 通过遍历列表来访问。
从5.3的文档中引证的方向。元组和序列:
虽然元组可能看起来类似于列表,但它们通常用于不同的情况和不同的目的。元组是不可变的,通常包含不同的元素序列,可以通过解包(参见本节后面的内容)或索引(对于namedtuples,甚至可以通过属性访问)访问这些元素。列表是可变的,它们的元素通常是同构的,并通过遍历列表来访问。
换句话说,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)
]
前面已经提到,这种差异主要是语义上的:人们期望元组和列表表示不同的信息。但这不仅仅是一个指导方针;一些库实际上根据传递的内容表现不同。以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中,列表和元组是完全不同的东西。
推荐文章
- 如何激活蟒蛇环境
- 省略[…]意思是在一个列表里?
- 为什么我得到“'str'对象没有属性'读取'”当尝试使用' json。载入字符串?
- 不区分大小写的列表排序,没有降低结果?
- 排序后的语法(key=lambda:…)
- 在烧瓶中返回HTTP状态代码201
- 使用python创建一个简单的XML文件
- APT命令行界面式的yes/no输入?
- 如何打印出状态栏和百分比?
- 在Python中获取大文件的MD5哈希值
- 在Python格式字符串中%s是什么意思?
- 如何循环通过所有但最后一项的列表?
- python用什么方法避免默认参数为空列表?
- ValueError: numpy。Ndarray大小改变,可能表示二进制不兼容。期望从C头得到88,从PyObject得到80
- Anaconda /conda -安装特定的软件包版本