列表(list)
- 列表是动态数组,可变(增加、修改不会使 ID 发生变化)且可以重设长度(包括增加、删除、修改元素)
- 列表中的元素可重复,元素之间的类型可以不同,元素的值可以修改
- 使用
[]
来定义列表 - 可以索引,可以切片
- 列表常用来保存多个独立的同质(homogeneous)对象,例如北上广深的人口数量
- 由于列表是动态数组,支持
resize
操作,因此当一个列表没有空位放新的元素的时候,Python 会创建一个新的列表,把老的列表里面的元素以及新添加的元素放进去,同时把旧的列表销毁。 - 当我们试图创建一个有
n
个元素的列表时,Python 会创建一个可以放n+k
个元素的列表,为未来添加元素预留了k
个位置,这样可以减少分配空间和内存复制的次数(很耗费计算资源),从而节省计算资源。 - 所以说保存同样的元素个数的时候,元组占用的空间更小。
元组(tuple)
-
元组是静态数组,不可变且内部数据一旦创建便无法改变(此外,数字、字符串也属于不可变类型)
-
元组里的元素、元组的大小在创建完成以后不能改变,如果赋新的值则 ID 会发生变化
-
注意,这里的不可变指的是元组中每一个元素对象的引用(指针)不可变,但是如果某个元素对象本身是可变的对象,那么你是可以对这个可变对象进行修改的。例如,元祖里面有一个元素是列表,这个列表里面的内容是可以修改的。
-
元组里元素的类型可以不同
-
使用
()
来定义元组 -
可以切片、可以索引
-
元组常用来描述一个不会改变的事物的多个异质(heterogeneous,对比上面的“同质”,意思是不同位置的元素表达不同的意思)属性,例如一个城市的经纬度。这也是为什么元组不可变而列表可变的原因,因为列表储存同质的对象,例如北上广深的人口数,我们可以再加上成都苏州的人口数、或者删掉深圳的人口数也没有问题,但是元组里面一个城市的经纬度删掉一个或者修改一个是没有意义的。
-
关于可变与不可变的另一个例子:你外出散步的时候可以用元组
(x,y)
描述当前的经纬度,如果你想记录自己的轨迹,那么可以用列表记录每一秒的[(x,y)]
。 -
由于字典的
key
必须是不可变类型,因此列表不能作为字典的key
,但是元组可以 -
如果实在想修改已经定义好的元组:
①可以通过切片来实现删除元素的功能;
②可以通过
+
运算来实现拼接的功能,类似于列表的resize
操作 -
创建元组的速度比创建列表的速度快 3-5 倍。一般不再用到的变量所占用的资源会被释放还给操作系统,但是长度为 1-20 的元组即使不再使用了,也不会把它们占用的资源立刻还给操作系统,而是留作未来使用,这样在以后创建同样大小的元组的时候,就不用重新申请内存了。