list
list是有序的集合,可随时添加删除元素。用中括号[]圈起来,例如
>>> 花名册 = ['张三','李四','王五','赵六'] >>> 花名册 ['张三', '李四', '王五', '赵六']
在这里,花名册是一个变量,就是一个有序的list,索引排序的位置是从[0]开始,依次往后,len()函数可以统计list中元素个数:
>>> len(花名册) 4 >>> 花名册[0] '张三' >>> 花名册[1] '李四' >>> 花名册[2] '王五' >>> 花名册[3] '赵六' >>> 花名册[4] Traceback (most recent call last): File "", line 1, in IndexError: list index out of range
索引的位置超出了列表的元素总数的话就会报错indexerror,最后一个元素的索引位置可以记为len(花名册)-1
索引序列还可以倒序排列,最后一个元素的位置是-1,依次往前数就是-2、-3、-4
>>> 花名册[-1] '赵六' >>> 花名册[-2] '王五' >>> 花名册[-3] '李四' >>> 花名册[-4] '张三' >>> 花名册[-5] Traceback (most recent call last): File "", line 1, in IndexError: list index out of range
同样,超出索引范围报错indexerror,倒序从后往前数,有几个元素就有负几对应的位置。
追加与删除
前面说了,list是个随时可以添加删除元素的有序序列
追加到末尾 append 追加到指定位置 insert 删除末尾元素 pop 删除指定位置元素 pop 替换指定位置元素 直接向指定索引位置赋值
效果如下:
>>> 花名册.append('孙七') >>> 花名册 ['张三', '李四', '王五', '赵六', '孙七'] >>> 花名册.insert(0,'木人张') >>> 花名册 ['木人张', '张三', '李四', '王五', '赵六', '孙七'] >>> 花名册.pop() '孙七' >>> 花名册 ['木人张', '张三', '李四', '王五', '赵六'] >>> 花名册.pop(0) '木人张' >>> 花名册 ['张三', '李四', '王五', '赵六'] >>> 花名册[0]='木人张' >>> 花名册 ['木人张', '李四', '王五', '赵六']
list内部的元素可以是不同数据类型,一个list也可以作为另一个list的元素,如下,Q这个list里既有字符串,又有数值,又有布尔值;我们把之前的花名册这个序列添加到Q的末尾,最终的Q序列里面就有了四个元素,最后一个元素是另一个list序列花名册,话有点绕,但还算好理解:
>>> Q = ['Python',2020,True] >>> Q.append(花名册) >>> Q ['Python', 2020, True, ['木人张', '李四', '王五', '赵六']] >>> len(Q) 4
如果在Q中要取到木人张该如何操作?可以用Q[-1][0]表示,所以Q其实就是一个二维数组。
如果一个list为空,即里面没有元素,那么他的长度也就len应该等于0
>>> L = [] >>> len(L) 0
tuple
tuple叫做元组,它跟list最大的区别就是一旦初始化就不允许再变化,所谓初始化就是给它赋值。注意这里跟list的区别,元组tuple的内容是以()括起来的,list是用[]
>>> 花名册 = ('张三','李四','王五','赵六') >>> 花名册 ('张三', '李四', '王五', '赵六')
因为是不可变化的,自然就没有办法增加、删除、替换元素了。元组内元素的定位跟list一样,用[]扩住的序号表示,从第一位开始0,1,2….
>>> 花名册 = ('张三','李四','王五','赵六') >>> 花名册[0] '张三'
tuple的不可变性强调了数据的安全性,对于不需要用户交互变化的量,最好用tuple,能不用list就不用。
空tuple和1个元素的tuple
如果需要定义一个空的tuple,可以写作()
>>> t = () >>> t ()
如果是定义只有一个元素的的tuple,需要在单独元素的后面加一个逗号, 否则就变成了给花名册这个变量单独赋值,因为这里()等同于数学里的小括号,Python规定这种情况下按数学的小括号计算,那么这里就变成了赋值的作用。
>>> 花名册 = ('张三') >>> 花名册 '张三' >>> 花名册 = ('张三',) >>> 花名册 ('张三',)
换成数字更容易理解,如下,我们给t这个变量赋值为2020,和我们给t这个元组赋值为只有一个2020数值的序列,如下。可以看到当我们输出单一一个元素的元组时,Python也给我们在它后面加上了逗号,以避免与数学上的()混淆:
>>> t = (2020) >>> t 2020 >>> t =(2020,) >>> t (2020,)
“可变的”tuple
>>> t = ('a', 'b', ['A', 'B']) >>> t[2][0] = 'X' >>> t[2][1] = 'Y' >>> t ('a', 'b', ['X', 'Y'])
可以看出,初始化的时候元组t包含了三个元素:a、b和一个list [‘A’, ‘B’]
当对t[2][0]和t[2][1]重新赋值后,看似元组t的内容发生了变化,但事实上,作为元组t,它的元素依然是a、b和最初的那个list,只不过list作为一个容器,里面的内容发生了变化,而元组本身的内容并没有变化。
这可以帮助我们理解什么是tuple元组的“不变”其实说的是元组内的元素的指向永远不变,但当一个元素指向的对象是一个list,这个list是可变的。