在认识列表之前,可以先了解一下序列的相关知识,序列是一块用来存放多个值的内存空间,Python中常用的序列有列表,字符串,元组,集合,字典等,其中,集合和字典属于无序序列,列表,元组和字符串属于有序序列,他们都有自己的下标,可以支持双向索引。(下标是从0开始的,例如第一个元素的下标是0,第二个元素的下标是1)。
列表列表是Python的内置有序序列,每个元素都有自己的下标,我们可以将不同的元素放在中括号[ ]中,例如:[123,"hello","world"],每个元素之间用逗号隔开,我们可以将不同类型的元素放进同一个列表中,如数字,字符串,列表,元组等数据,其中,将列表放进列表中也叫做列表的嵌套。
lst = [[123, 456], 'hello', ['hi', 'hi']]
此处我们用自己定义的列表名:lst 来接收这个列表,也叫做将列表赋值给lst。
列表中的常用方法(index是元素的下标) 方法 | 说明 |
| list.append(x) | 将x添加至列表尾部 |
| list.insert(index,x) | 在index的位置添加x |
| list.remove(x) | 删除第一个x |
| list.pop(index) | 删除index处的元素 |
| list.clear() | 删除列表中的所有元素(列表还在) |
| list.count(x) | 返回x在列表中出现的次数 |
| list.reverse | 将列表进行倒序(翻转) |
| list,extend(list2) | 将list2的所有元素添加至list尾部(列表合并) |
在使用方法对列表进行操作时,当一个元素被删除的时候,他后面的元素会自动前移,不会留下空位。
关于列表更深层次的原理Python在修改对象时采用的是基于值的自动内存管理方式,就是说当对象修改值的时候并不是直接修改变量,而是将变量指向一个新的值,变量本身是不会改变的,变量的地址发生了改变。
lst = [1, 2, 3]
print('第一次输出的地址:', end='') # end=''可以让这句话在输出的时候不换行
print(id(lst)) # id()可以获取元素的地址
lst = [1, 2, 3, 4, 5]
print('第二次输出的地址:', end='')
print(id(lst)) # 通过对比两次输出可以发现lst的地址发生了改变
输出结果
通过对比,我们可以看出lst的地址发生了改变。
值得注意的是在使用下标来修改列表中元素的值得时候或者通过Python自身提供的列表方法来修改列表的时候,列表对象在内存中的起始位置是不会发生改变的,被改变的值的元素地址会发生改变。
特殊的,如extend()方法,该方法可以将另一个列表的元素添加至本列表的尾部,实现两个列表的拼接,通过extend()方法来增加列表元素的情况也不会改变内存的首地址,属于原地操作。
关于列表元素的添加操作 ①用Python自带的方法来添加元素如append(),insert()和extend(),详情参照上方的方法列表。
②用+运算符来添加元素
lst = [1, 2, 3] lst = lst + [4, 5] print(lst) #此时的输出结果将是[1,2,3,4,5]
虽然实现了元素的添加,但从严格意义上来说,我们并没有为列表添加元素,而是创建了一个新列表来将原来列表中的元素和新的元素合在一起赋值到新列表的内存空间中。
缺陷:当所需要添加大量元素的时候,该方法太过于繁琐。
③用*运算符来添加元素lst = [1, 2, 3] lst = lst * 3 print(lst) # 此时的输出结果将是[1,2,3,1,2,3,1,2,3]
和第二种方式一样,我们创建了一个新的列表,而没有真正意义上的扩展原列表。
需要注意的是,我们适用该操作时并没有复制原本的元素,而是创建了已有元素的引用,所以修改值得时候,所对应的引用也会被修改,这也意味着我们修改其中某一个数的时候,这个数被复制出来的数也会发生改变,如把上述的1改为5,那么输出的结果就会是[5,2,3,5,2,3,5,2,3]了。
关于列表元素的删除操作 ①使用Python自带的方法如remove()和pop(),详情参照上方的方法列表.
②使用del命令删除指定位置上的元素
lst = [1, 2, 3, 4, 5] del lst[1] print(lst) #此时输出的结果是[1,3,4,5]
此处del lst[ ]括号中填的是要删除的元素的下标
③利用循环和remove()来进行删除这个方法存在一些问题,所以在这里暂时不做阐述,我将在后面的文章详细聊这个问题产生的原因以及如何解决这个问题。



