Python基础三--推导式和深浅拷贝

推导式

1.列表推导式

列表推导能非常简洁的构造一个新列表:只用一条简洁的表达式即可对得到的元素进行转换变形。
语法:[变量 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)

2.字典推导式

字典推导和列表推导思想一样,语法差不多。

dict1={k:v for k,v in [('a',1),('b',2)]}
print(dict1)

3.集合推导式

集合推导式和列表推导式思想一样,语法差不多。

set1={i for i in (1,2,3,4)}
print(set1)

4.元组生成式

元组没有推导式,只有生成式,但是生成的是惰性序列,只有通过list()才能看到

tuple1={i for i in range(5)}
print(tuple1)#惰性序列
print(list(tuple1))
//执行结果
{0, 1, 2, 3, 4}
[0, 1, 2, 3, 4]

深浅拷贝.

1.深拷贝

拷贝所有对象,包括顶级对象以及嵌套对象,所以原始对象的改变不会造成深拷贝里任何子元素的改变。

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]]

2.浅拷贝

只拷贝顶级对象, 没有拷贝嵌套对象,所以原始数据改变,嵌套对象会改变!

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深浅拷贝

你可能感兴趣的:(python)