python基础二_03_推导式和深浅拷贝

python基础二_03_推导式和深浅拷贝

导读:
本文主要记录自己学习python3基础中推导式(列表,字典,集合)和深浅拷贝的要点知识和例子;仅供自己梳理。

一、列表推导式

列表推导能非常简洁的构造一个新列表:只用一条简洁的表达式即可对得到的元素进行转换变形。
语法:[变量 for 变量 in 可迭代对象]
1.为什么要使用推导式?
现在我们要生成一个列表,列表当中的元素为0-10,首先我们不用列表推导式,该如何来实现?
list1 = []
for i in range(10):
    list1.append(i)
print(list1)
那如何用列表推导式呢?
# 很明显,使用推导式代码简洁很多
list2 = [i for i in range(10)]
print(list2)
2.在列表推导式中使用流程控制
求出0-20间所有的偶数
list3 = [i for i in range(20) if i %2 == 0]
print(list3)
打印出从(0,0)到(9,9)的所有坐标
list4 = [ (i,j) for i in range(10) for j in range(10)]
print(list4)
# 类似的还有:
# a = [(i,j) for i in range(1,5) for j in range(6,10)]
# print(a)

# 可以看到两层循环的列表推导式可读性就有点差了,所以多次嵌套不建议列表推导式

在这里插入图片描述

比如现在有一列表L = [[1,2,3],[4,5,6],[7,8,9]]。要求出1/4/7 和 1/5/9 元素,思考如何取出?
L = [[1,2,3],[4,5,6],[7,8,9]]
# 取到 147
result1 = [i[0] for i in L]
print(result1)
# 取到 159
# len(L)获取长度为3,第一次i = 0,L[i][0]取值下标为0 中的第一个元素
result2 = [L[i][i] for i in range(len(L))]
print(result2)

二、字典推导式

字典和集合推导式是以上思想的延续,语法差不多,只不过产生的是集合和字典而已。
dic1 = {k:v for k,v in [('a',1),('b',2)]}
print(dic1)

三、集合推导式

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

四、元组生成式

元组没有推导式,只有生成式,但是生成的是惰性序列,只有通过list()才能看
tup1 = (i for i in range(5))
print(tup1) # 惰性序列
print(list(tup1))

在这里插入图片描述

五、深浅拷贝

1.深拷贝:
拷贝所有对象,包括顶级对象以及嵌套对象,所以原始对象的改变不会造成深拷贝里任何子元素的改变
2.浅拷贝:
只拷贝顶级对象, 没有拷贝嵌套对象,所以原始数据改变,嵌套对象会改变!
3.应用场景
   比如在CMDB系统中,我们定义了一个报警模版call给所有的服务器使用,
   此时有一批特殊应用的服务器需要不通的报警参数,
   我们既不想单独新建模版来一个一个添加报警参数,又不想修改默认模版而影响其他机器的报警阈值。
   此时我们就需要用深拷贝来完成。
   我们在维护服务器信息的时候,经常会要更新服务器信息,这时我们重新一个一个添加是比较麻烦的,
   我们可以把原数据类型拷贝一份,在它的基础上做修改。
4.简单的例子
import copy
a = [1,2,3,4,[5,6,7,9,10]]
b = a
print('a的di:%s,b的id:%s'%(id(a),id(b)))
c = copy.copy(a)
print(id(c))
d = copy.deepcopy(a)
print(id(d))
a.append(8)
a[4].append(9)
print(a)
print(b)
print(c)
print(d)

在这里插入图片描述

想深入了解原理的话推荐这篇文章,写的很详细:python深浅拷贝
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值