列表推导能非常简洁的构造一个新列表:只用一条简洁的表达式即可对得到的元素进行转换变形。
语法:[变量 for 变量 in 可迭代对象]
1.1为什么使用推导式
生成一个列表,列表当中的元素为0-9。
按常规方法生成
list=[]
for i in range(10):
list.append(i)
print(list)
使用推导式生成
list1=[i for i in range(10)]
print(list1)
可以看出使用推导式生成可以简化代码
1.2列表推导式的基本操作
求出0-20之间的偶数
list2=[i for i in range(20) if i%2==0]
print(list2)
打印出从(0,0)到(9,9)的所有坐标
list3=[(i,j) for i in range(10) for j in range(10)]
print(list3)
#打印横坐标为(1-5)纵坐标为(6-10)的所有点
list4=[(i,j) for i in range(1,5) for j in range(6,10)]
print(list4)
已知有列表list5=[[1,2,3],[4,5,6],[7,8,9]]。要求取出1/4/7和1/5/9,。
list5=[[1,2,3],[4,5,6],[7,8,9]]
#1/4/7
a=[i[0] for i in list5]
print(a)
#len(list5)获取长度为3,第一次i=0,list5[i][0]取值下标为0中的第一个元素
b=[list5[i][i] for i in range(len(list5))]
print(b)
字典推导和列表推导思想一样,语法差不多。
dict1={k:v for k,v in [('a',1),('b',2)]}
print(dict1)
集合推导式和列表推导式思想一样,语法差不多。
set1={i for i in (1,2,3,4)}
print(set1)
元组没有推导式,只有生成式,但是生成的是惰性序列,只有通过list()才能看到
tuple1={i for i in range(5)}
print(tuple1)#惰性序列
print(list(tuple1))
//执行结果
{0, 1, 2, 3, 4}
[0, 1, 2, 3, 4]
拷贝所有对象,包括顶级对象以及嵌套对象,所以原始对象的改变不会造成深拷贝里任何子元素的改变。
import copy
p1=["name",["a",100]]
p2=copy.deepcopy(p1)
p3=copy.deepcopy(p1)
p2[0]="zhangsan"
p3[0]="vadvs"
p2[1][1]=50
print(p2)
print(p3)
//执行结果
['zhangsan', ['a', 50]]
['vadvs', ['a', 100]]
只拷贝顶级对象, 没有拷贝嵌套对象,所以原始数据改变,嵌套对象会改变!
import copy
p1=["name",["a",100]]
print(p1)
#方法一
#p2=p1.copy()
#p3=p1.copy()
#方法二
#p2=copy.copy(p1)
#p3=copy.copy(p1)
#方法三
#p2=p1[:]
#p3=p1[:]
#方法四
p2=list(p1)
p3=list(p1)
p2[0] ="zhangsan"
p3[0] ="djsv"
#p2[1]=60
p2[1][1]=50
//执行结果
['name', ['a', 100]]
['zhangsan', ['a', 50]]
['djsv', ['a', 50]]
对于浅copy来说,第一层创建的是新的内存地址,而从第二层开始,指向的都是同一个内存地址,所以,对于第二层以及更深的层数来说,保持一致性。
深浅拷贝原理推荐这篇文章
Python深浅拷贝