一、列表的基本知识:
- 1、列表是可变元素,列表内部函数操作大多是操作list本身,即它原来的数据发生变化,大多内置函数没有返回值;也
- 有存在返回值的:------------- 例如:list(iterable)、tuple(iterable) 它们的返回值是修改的内容,用变量接收打印,
- 原数据不变。
- 2、列表的深浅拷贝的区别(浅拷贝:一级元素相互独立,二级及以上元素引用{共用空间};深拷贝:完全拷贝)
- 3、引用:常见的 赋值 操作就是 引用(注意引用与浅拷贝之间的区别) ,列表操作中,append 可变元素就是一个
- 引用。
概念:列表是由一系列按特定顺序排列的元素组成,列表能存储多种类型的数据,其中的元素之间可以没有任何关系
1、列表的创建:
①、直接创建:
②、list与str间的相互转化:
列表与字符串互相转化:
str >>> list
1、list(iterable)系统函数 # 函数对象必须是iterable,list(iterable);
print(list("abc")) #结果:['a','b'.'c']
2、str.split()
print("我们_去_上海".split('_')) 结果:['我们','去','上海']
# 数据库中存储的类型数据(str类型)
list >>> str
1、如果list元素全是字符串, 用str.join(iterable)# join的本质:字符串拼接
print('_'.join(['我们','去','上海']))
2、如果不全是字符串:
for 循环 遍历元素,转化为str后拼接
2、列表拼接(+)与重复(*)
1、列表的拼接
str1 = [1,2,]
str2 = ['a','b']
print(str1+str2) ------ 相当于 str1.expend(str2),结果:[1,2,'a','b']
2、列表的重复
str1 = [1,2,]
print(str1*3) ---------- 结果:[1,2,1,2,1,2]
二、list 数据的基本操作方法:
1、索引与切片:
(1)索引:
- 特点: 与str相同 ,用 下标 取值
list1 = [2,3,4,5]
print(list1[2]) ----------- 下标以0 开始
(2)切片:
- 特点:与str 用法类型,不过结果是一个 列表 ,区间 前闭后开
https://blog.csdn.net/qq_16555103/article/details/83625995 -------- 第三节
================================ 切片赋值 与 索引赋值的区别 ========================
1、切片赋值
list1 = [1,2,4,6]
list1[1:3] = 'abcdefghigk'
print(list1) ---------- [1, 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'g', 'k', 6]
2、索引赋值
list2 = [1,2,3,4]
list2[2] = 'abcdefgt'
print(list2) ---------- [1, 2, 'abcdefgt', 4]
三、列表元素的增删改查:
1、增加元素: append、extend、insert
- 特点:list内部函数,list数据类型不可用赋值的方法增加列表的元素,区别于dict。
①append 追加 : list.append()
append函数没有return值,添加元素保存在原list中。list
- 注意:列表操作中,append 可变元素 是一个引用
list1 = [1,2,'a']
list1.append([6,7,8])
print(list1) # 结果 [1, 2, 'a', [6, 7, 8]] 注意与extend的区别。
②expend 扩展 :list.extend()
list1 = [1,2,'a']
list1.extend([777,888,9999])
print(list1) #结果 [1, 2, 'a', 777, 888, 9999]
③insert 插入: list.insert(index,值)
list1 = [1,2,'a']
list1.insert(2,[99,000]) # 先索引 后插入值
print(list1) # 结果 [1, 2, [99, 0], 'a']
2、删除元素(pop、remove、del 关键字):
① list.pop(index):根据 索引,得到 值
list1 = [1,2,'a']
p = list1.pop() --------------- 支持索引 默认最后一个 return删除元素
print(list1) --------------- 删除元素后的list
print(p) --------------- return删除元素
# 结果 [1, 2]
a
② list.remove(值):根据值 删除,每次只删一个
- 特点:不知道索引时,指定元素删除,重复元素时 默认每次只删除第一个,没有return值(None)。删除所有用
- while循环。
list1 = [1,2,'a',9999,2222,9999,9999]
p = list1.remove(9999)
print(list1) ------- 结果:[1,2,'a',2222,9999,9999]
print(p) ------- 结果:9999
===============================================================================
while 值 in list1: ---------- 删除所有
list1.remove(值)
③ 关键字del: 根据 索引,不可访问
- 用法:del list[index] ,不加索引时全部删除,即删除这个变量,注意与 clear 区别
list1 = [1,2,'a',9999,9999,9999]
del list1[3] #
print(list1)
3、修改元素和查看元素:
①查找元素:
用索引的方式查找元素。
②修改元素:
- 特点:用索引赋值的方式修改元素 : list1[index] = ' ',但是不可以利用赋值操作增加 索引范围 以外的元素
- (增加用append、extend)。
4、查找元素是否存在: in、not in 返回bool值
list1 = [1,2,3,4,56]
if 3 in list1:
print('存在3')
else:
print('不存在3')
四、list内置函数:
1、list常用的系统函数:max() 取最大值
- 注意:① 根据每个元素第一个字母,max 与 min 是按照ASCII码来排序,如果元素是列表,比较大小是按照列表
- 第一个元素来比较。
- ② max 、min 也可用于字符串中。
- ③ 字符串与数字无法比较
list1 = [1,2,'a',9999,9999,9999]
list2 = ['a78','123','sh']
list3 = [747,888,989]
print(max("29889aA7"))
print(list1) #报错 列表中int与str无法比较
print(list2)
print(list3)
2、计数count, 扩展extend、索引index:
list1 = [1,2,'a',9999,9999,9999]
print(list1.count(9999)) ----- 结果:3
print(list1.index(9999,4,5)) ----- 结果:4 # 三个参数,只返回第一个值的索引;如果不存在报错
3、反向reverse,排序sort,清空clear,复制copy:
- 注意 list.sort() 没有返回值,改变原list,默认从小到大,list.sort(reverse=True) ---- 降序
- list.copy() 相当于浅拷贝
(1)list.clear() 注意事项:
清空clear()请注意,可以用 赋值 空列表([]) 来清空。
list1 = [1,2,3]
list2 = []
list2.append(list1) append追加列表时相当于追加一个 引用,他们共同使用一个内存空间,因此清空list1时list2也跟着清空。
print(list1,list2)
list1.clear()
print(list1,list2) # 结果 : [1, 2, 3] [[1, 2, 3]]
# [] [[]]
# 改进1、
import copy
list1 = [1,2,3]
list2 = []
list2.append(list1)
list2 = copy.deepcopy(list2) 深拷贝
print(list1,list2)
list1.clear()
print(list1,list2) # 结果 : [1, 2, 3] [[1, 2, 3]]
[] [[1, 2, 3]]
# 改进2、
可以将源代码中 list1.clear() 改为 list1 = [] 。 打印结果与 改进1 结果相同。
五、深浅拷贝与引用:
https://blog.csdn.net/qq_16555103/article/details/83748253
1、引用:
直接赋值:其实就是对象的引用(别名)。
2、深浅拷贝:
python 中深浅拷贝需要 引入 模块 copy
(1)浅拷贝:
(2)深拷贝: