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
原文地址:https://www.cnblogs.com/tarantino/p/10219439.html