列表和元组(python)

python按照存放可以分为,容器化序列扁平化序列,容器话序列存放的是他们所包含的任意类型的对象的引用,而扁平化序列存放的是值而不是引用。按照能否被修改分类,可以分为可变序列不可变序列当容器化序列遇到可变序列时,要格外小心
列表(list)属于容器化序列和可变序列
列表推导式

[i for i in range(3)]

输出的结果

[0, 1, 2]

注意:在python2.x中,列表推导式中的for 关键词之后的赋值操作可能会影响列表推导上下文中的同名变量,这种情况在python3中是不会出现的

元组(tuple)属于容器化序列和不可变序列
元组其实就是对数据的记录:元组中的每个元素存放了记录中一个字段的数据,外加这个字段的位置,正是这个位置信息给数据赋予了意义
具名元组
collections.nametuple 是一个工厂函数,他可以构建一个带字段名的元组和一个有名字的类---这个带名字的类对调试程序有很大的帮助
注意:元组虽然是不可变序列,但是元组中他如果有可变序列,会发生意想不到的错误
例如:

>>> t = (1, 2, [3, 4])
>>> t[2] += [5, 6]
Traceback (most recent call last):
 File "", line 1, in 
TypeError: 'tuple' object does not support item assignment
>>> t
(1, 2, [3, 4, 5, 6])

切片
在对seq(start, stop, step)进行求值时,python会调用seq.__getitem__(slice(start, stop, step))
序列的增量赋值
+= 背后的特殊方法是__iadd__(用于就地加法),但是如果一个类没有实现这个方法,python会退一步调用__add__
总体来说可变序列,一般都实现了__iadd__方法,一般+=是就地加法,而不可以变序列根本就不支持这个操作,对这个方法的实现也就无法谈起
上述所说的关于+=同样适用于*=,后者对应的方法是__imul__
list.sort 方法就地排序列表,也就是说不会把原列表复制一份,与之相反的是sorted,他会新建一个列表作为返回值

有时候列表不适合当首选时

  • 存放数量较多的浮点数时,数组的效率要高很多
  • 频繁的都序列做先进先出的操作时,deque的速度应该会快很多
  • 包含操作的频率很高时, 用set会更适合

你可能感兴趣的:(列表和元组(python))