一、 列表的特性介绍
![16d106dc555fd63a816c23bd1fe7bebb.png](https://i-blog.csdnimg.cn/blog_migrate/f89dc576cbe746557e202e392ec5eb38.jpeg)
- 列表和字符串一样也是序列类型的数据
- 列表内的元素直接用英文的逗号隔开,元素是可变的,所以列表是可变的数据类型,而字符串不是。
- 列表的元素可以是 Python 中的任何类型的数据对象
如:字符串、列表、元组、字典、集合、函数 - 列表中的具有相同值的元素允许出现多次
[1, 2, 1, 1, 1, 1, 3, 3, 2]
二、 创建列表
![dff85615230028e0133ea5978646c12c.png](https://i-blog.csdnimg.cn/blog_migrate/2047b97d2fec1b3dc4e17b1524e12a7c.jpeg)
三、嵌套的列表
列表中可包含 python 中任何类型的元素(对象),当然也可以包括一个或多个列表
li = [['one', 'two', 'three'], [1, 2, 3]]
四、 列表的基本操作
1. 取值
1.1 没有嵌套的列表取值
In [90]: l2 = ['insert', 'append', 'remove', 'pop', 'sort']
In [91]: l2[0]
Out[91]: 'insert'
In [92]: l2[-1]
Out[92]: 'sort'
1.2 嵌套的列表取值
In [93]: l3 = [['one', 'two', 'three'], [1, 2, 3]]
In [94]: l3[0]
Out[94]: ['one', 'two', 'three']
In [95]: ll = l3[0]
In [96]: ll[1]
Out[96]: 'two'
In [97]: l3[0][1]
Out[97]: 'two'
2. 就地修改
可以通过索引直接修改索引对应位置的数据
In [113]: li
Out[113]: ['qfedu.com', 1314, '521']
In [114]: li[0] = '千锋教育'
In [115]: li
Out[115]: ['千锋教育', 1314, '521']
3. 切片
同字符串的切片一样,详情参考字符串教程中的切片
几点简单示例
In [100]: line = 'Size: 8192 MBn'
In [101]: line.split('n')
Out[101]: ['Size: 8192 MB', '']
In [102]: l5 = line.split('n')
In [103]: l5[:-1]
Out[103]: ['Size: 8192 MB']
In [104]: line.split('n')[:-1] # 可以直接连续操作
Out[104]: ['Size: 8192 MB']
4. 必会方法
len()
方法是一个内置函数,可以统计序列类型的数据结构的长度。
In [108]: li = ['qfedu.com', 1314, '521']
In [109]: len(li)
Out[109]: 3
in
判断元素是否存在于列表中。
In [3]: li = ['qfedu.com', 1314, '521']
In [4]: '521' in li
Out[4]: True
In [5]: 1314 in li
Out[5]: True
In [6]: if 'qfedu.com' in li:
...: print('ok')
...:
ok
In [7]:
append()
向列表的最后位置,添加一个元素,只接收一个参数。
In [7]: li.append(521)
In [8]: li
Out[8]: ['qfedu.com', 1314, '521', 521]
insert()
向原列表的指定位置插入一个元素,接收两个参数, 第一个是索引号,第二个是要插入的元素。
In [9]: li.insert(0, 521)
In [10]: li
Out[10]: [521, 'qfedu.com', 1314, '521', 521]
remove()
移除列表中某个指定的元素,没有返回值,并且假如有多个相同值的元素存在,每次只会移除排在最前面的那个元素
In [14]: li.remove(521)
In [15]: li
Out[15]: ['qfedu.com', 1314, '521', 521, 'qf', 'yangge']
pop()
从原列表中删除一个元素,并且把这个元素返回。 接收零个或一个参数,参数是偏移量,int 类型。
# 删除列表中的最后一个元素
In [16]: name = li.pop()
In [17]: name
Out[17]: 'yangge'
In [18]: li
Out[18]: ['qfedu.com', 1314, '521', 521, 'qf']
# 删除列表中第二个索引号对应的元素,并且返回这个元素,用变量名`n` 接收。
In [19]: n = li.pop(-2)
In [20]: n
Out[20]: 521
In [21]: li
Out[21]: ['qfedu.com', 1314, '521', 'qf']
index()
获取某个元素在列表中的索引
In [1]: li = [147, 258, 369]
In [2]: li.index(258)
Out[2]: 1
extend()
将一个序列对象的每个元素添加到当前列表中
In [6]: li = [147, 258, 369]
In [7]: l2 = [456, 789]
In [8]: li.extend(l2)
In [9]: li
Out[9]: [147, 258, 369, 456, 789]
In [10]: li.extend('hello')
In [11]: li
Out[11]: [147, 258, 369, 456, 789, 'h', 'e', 'l', 'l', 'o']
5. 循环列表
for-list.py
文件内容如下:
li = ['qfedu.com', 1314, '521', 'qf']
for item in li:
print(item)
执行
python3 for-list.py
输出结果
qfedu.com
1314
521
qf
6. 深浅拷贝
In [110]: base_count = ['name',['money',100.00]]
In [111]: xmen = list(base_count)
In [112]: xpan = base_count.copy()
In [113]: xmen[1][1] = 20.00
In [114]: xpan
Out[114]: ['name', ['money', 20.0]]
上面的结果起始不是我们想要的,这是由于 python 对于嵌套的数据是应用赋值的
无论外层的列表如何创建新的对象,每个新对象的内部的列表都是引用,不会创建新的对象。
Visualize Python, Java, JavaScript, C, C++, Ruby code executionwww.pythontutor.com![91a81a1dd6286540ac5a7a8f321a339d.png](https://i-blog.csdnimg.cn/blog_migrate/7bfbbc99d1fc372e3eed9af3a6e62674.jpeg)
![1dd8b5979a2a4ee3a0a1cbda09f9b905.png](https://i-blog.csdnimg.cn/blog_migrate/54674c9b5c1f630291ce3f0365d90846.jpeg)
解决办法 使用深拷贝创建一个完整的对象
# 导入模块
import copy
base_count = ['name',['money',100.00]]
# 利用模块中的 copy 方法创建一个全新的对象
xmen_new = copy.deepcopy(base_count)
# 利用模块中的 copy 方法创建另一个全新的对象
xpan_new = copy.deepcopy(base_count)
# 改变其中一个对象中的值
xpan_new[1][1] = 50.00
# 分别打印两个对象
print(xmen_new)
print(xpan_new)