python中的列表
在python中,列表是可变数据类型
以下面案例作为说明:
>>> li = [1, 2, 3] >>> id(li) 1922056253512 >>> li.append(4) >>> li [1, 2, 3, 4] >>> id(li) 1922056253512
可见对列表取值做了修改之后,列表的内存地址并没发生改变,说明列表是可变数据类型。
列表有许多操作,下面通过案例一一介绍:
1.列表支持索引:
>>> li = [1, 2, 3] >>> li[1] 2 >>> li[1:] [2, 3] >>> li[:2] [1, 2] >>> li[:] [1, 2, 3]
>>> li.index(3)
2
2.列表的增删改查
>>> li = [1, 2, 3] >>> li.append(4) >>> li [1, 2, 3, 4] >>> li.extend((5, 6)) #批量增加,必须是可迭代对象 >>> li [1, 2, 3, 4, 5, 6] >>> li.insert(3, 7) #指定位置插入元素 >>> li [1, 2, 3, 7, 4, 5, 6] >>> li.pop() 6 >>> li [1, 2, 3, 7, 4, 5] >>> li.remove(4) >>> li [1, 2, 3, 7, 5] >>> li[1] = 9 >>> li [1, 9, 3, 7, 5] >>> li[3] 7
>>> li
[1, 9, 3, 7, 5]
>>> li.clear() #清空列表元素
>>> li
[]
3.统计元素出现次数:
>>> li = [3, 5, 2, 1, 2, 7] >>> li.count(2) 2
4.顺序排序和逆序排序
>>> li = [3, 5, 2, 1, 2, 7] >>> li.sort() >>> li [1, 2, 2, 3, 5, 7] >>> li = [3, 5, 2, 1, 2, 7] >>> li.reverse() >>> li [7, 2, 1, 2, 5, 3]
5.列表的复制
要想实现列表复制效果有三种方式:赋值、浅copy、深copy。
三种方式之不同:
5.1赋值后的列表共享原列表的内存地址,意味着原列表发生改变时,被复制的新列表也发生改变,如下:
>>> li1 = [1, 2, [4, 3]] >>> li2 = li1 >>> li1 [1, 2, [4, 3]] >>> li2 [1, 2, [4, 3]] >>> id(li1) 1922056248520 >>> id(li2) 1922056248520 >>> li1[1] = 4 >>> li1 [1, 4, [4, 3]] >>> li2 [1, 4, [4, 3]]
5.2浅copy:经过浅copy后新列表和原列表有不同的内存地址,但是而这并不是独立的,先看如下代码:
>>> li1 = [1, 2, [4, 3]] >>> li2 = li1.copy() >>> li1 [1, 2, [4, 3]] >>> li2 [1, 2, [4, 3]] >>> id(li1) 1922056248328 >>> id(li2) 1922055173256 >>> li1[1] = 4 >>> li1 [1, 4, [2, 3]] >>> li2 [1, 2, [2, 3]]
发现改变原列表的嵌套列表时,新列表也发生了变化,为何?
浅copy复制的只是父级列表下的直接元素的内存地址,当这个内存地址对应的变量类型作为可变数据发生改变,那么新的列表也会发生改变,原因是这个可变数据发生改变时,它的内存地址不会发生变化。
而当这个内存地址对应的变量类型作为不可变数据发生改变,那么他的内存地址就变了,而新的列表复制的是它原来的内存地址,是不会变化的。
>>> li1 = [1, 2, [4, 3]] >>> li2 = li1.copy() >>> li1[2][0] = 2 >>> li1 [1, 2, [2, 3]] >>> li2 [1, 2, [2, 3]] >>> id(li1[2]) 1922056248648 >>> id(li2[2]) #改变作为可变类型的嵌套列表的数值,其内存地址不会变化 1922056248648 >>> li1[1] = 4 >>> li1 [1, 4, [2, 3]] >>> li2 [1, 2, [2, 3]] >>> id(li1[1]) 1587703360 >>> id(li2[1]) #改变作为不可变类型的数字的取值,其内存地址发生了变化,而新列表还是原来内存地址因此不会变化 1587703296