列表是可变数据类型
将列表传递给函数时,由于列表是可变数据类型,所以列表的内容可能会在函数调用后改变
列表不仅可存放不同类型数据,还可存放大量数据.32位5亿,64位1152921504606846975
创建列表
>>> lis = list() # 只能创建空列表
>>> lis = list([])
>>> lis = []
>>> lis = list(range(x)) # 脑子要爆,2是直接生成列表,3是迭代器?
>>> lis = list("abcdefg")
增删改查
>>> lis.append() # 将元素添加到列表尾部
>>> lis.extend() # 将所有元素迭代追加到列表中
>>> lis.insert(index,object) # 将元素插入指定下标
● 以上打印返回none;打印源列表有变;append效率高于insert
>>> lis.pop(index) # 删除给定位置元素,返回删掉元素;默认删最后一个
>>> lis.remove(object) # 删除列表中第一次出现的给定元素;不存在默认
>>> lis.clear() # 清空
>>> del lis[index] # 可以切片删
>>> lis[index] = object # 替换元素,可以切片,迭代的替换
>>> lis.index(object) # 返回元素出现第一个下标
>>> lis.count(object) # 元素出现次数
切片和排序
- 列表里同时有str和int不能排序
>>> lis.reverse() # 将列表中元素倒序
>>> lis.sort() # 升序排序
>>> lis.sort(reverse=True) # 降序排序
>>> lis = sorted(lis, key=object) # 创建排序后的列表
| >>> def func(name):
| return len(name)
| >>> lis = sorted(lis, key=func)
| >>> lis = sorted(lis, key=lambda name:(len(name)))
● sort和sorted都可以加参数key
● sort和reverse是list自带的方法,作用在旧列表上
● sorted和reversed是内建函数;sorted返回新列表,reversed返回迭代器
三元表达式和列表推导式
>>> lis1 = [1, 2, 3, 4, 5]
>>> for i in lis1:
lis2.append(i)
>>> lis2 = [i for i in lis1] # 列表推导式
● 列表直接赋值给新表的结果是修改原列表,新列表也会变
>>> lis = [i for i in range(30) if i % 3 == 0] # 三元表达式
>>> lis3 = [j for i in lis for j in i if j.count("e") == 2]
● 列表推导式的结果是一个生成器。不加括号报错,加中括号转list,加小括号就是生成器
● 测试生成器generator可以直接加中括号强转,iterator不能加中括号强转
● generator == [] iterator == list()
列表复制
>>> lis2 = lis1 + []
>>> lis2 = [x for x in lis1]
垃圾回收机制
- GC是python自带的垃圾回收机制
- 1.引用计数
| 赋值给变量名,包括将变量名赋值给其他变量名,都是直接引用
| 把变量名存放到列表等容器类数据类型中,就是间接引用
| 容器中存放的是元素的内存地址
- 2.标记清除
| del 变量名
| 将变量名指向其他变量
| 实际的标记清除机制是在内存空间不够用时,扫描栈区(既变量名区域),将存在变量值的变量名做标记
- 3.分代回收
| 分代回收核心是在历经多次扫描后,都没有被回收的变量,gc机制认为该变量是常用变量,gc会降低扫描频率
| 分代指的就是根据存活时间来为变量划分不同等级
| 新定义的变量放到新生代这个等级中,权重达到设定值转入青春代,权重达到设定值转入老年代
面试题
1. def func(a,b=[]):pass 有什么坑?
def func(a,b=[]):
b.append(a)
return b
v1 = func(1)
v2 = func(2,[])
v3 = func(3)
print(v1,v2,v3) # [1,3] [2] [1,3]
- 如果在函数的默认参数中设置可变参数,在函数的内部会维护一个列表,供所有调用者使用。
- 1.先解释了函数,在函数内部维护了一个 b=[]
- 2.这个时候v1里边只有一个1
- 3.随后v2里放入了一个新列表,v2里边只有1个2
- 4.v3指向的也是b=[],所以现在列表里是[1,3]
2.写带参数的装饰器