Python之路【第十一篇】:三目运算、不同数据类型的存储方式及深浅拷贝(copy模块)、列表推导式
三目运算
又叫做三元运算,是简单if.....else.....语句的一种替代格式,如:
k = 1 if k == 1: print(True) else: print(False)
如上if....else语句输出结果为True,可以用如下三目运算代替:
k = 1 print(True) if k ==1 else False
可以看到,三目运算就是简单if....else...语句的一种代替
不同数据类型在内存中的存储方式
str类型:
s1 = 'hello' print(id(s1)) print(id(s1.upper()))
输出结果为:
90146656
89414152
s1 = 'hello' print(id(s1)) s2 = s1 print(id(s2))
输出结果为:
79793328
79793328
从以上两个实例不难看出,对于str类型,创建之后,如果再修改,就是相当于在内存中重新创建了一次,但是把一个str的值赋值给另一个变量,这两个变量指向的是同一块内存区域
s = '123' for i in s: print(id(i))
输出结果为:
86225944
90615400
90828512
从该例我们可以看出,str中字符的存储地址在内存中是不连续的
list类型:
li1 = [1,2,3] li2 = li1 print(id(li1)) print(id(li2))
输出结果为:
85447048
85447048
li1 = [1,2,3] print(id(li1)) print(id(li1.append(4)))
输出结果为:
78303624
1376115800
从以上两个实例可以看出,对于list类型,创建之后,如果再修改,就是相当于在内存中重新创建了一次,但是把一个list的值赋值给另一个变量,这两个变量指向的是同一块内存区域
对于字典也有这样的结论,不在另外举例
li = [1,2,3] for i in li: print(id(i))
输出结果为:
83387256
83387232
83387208
从该例可以看出,list类型的数据,其元素如果是数字在内存中是连续存放的,如果是字符,元素的存放并不连续
本想在这里探究一下存储的方式,但是细节太多,兵来将挡,水来土掩吧,用id直接查看他们的地址吧!
深浅拷贝
拷贝也分深浅,从字面意思来看,两种拷贝方式的不同就在于拷贝的程度深浅不一样
浅拷贝:只拷贝最外面一层
深拷贝:除去最内层全部拷贝
在python中有一个copy模块,copy.copy()为浅拷贝,copy.deepcopy()为深拷贝
对于数字和字符串来说,无论是深拷贝还是浅拷贝,id永远都是一样的,只要修改,就需要再创建一个
对于列表、元组、字典等其他来说,浅拷贝只拷贝最外面一层,深拷贝比较彻底,但最后一层(最底层的字符串,数字)不拷贝
列表推导式
列表推导式又叫列表生成式,由名字不难看出,得出的结果是一个列表。
当然生成一个列表也可以有别的一些方法,但是通过列表推导式可以写出很简洁的代码
如:
1 2 | ret = [x * x for x in range ( 10 )] print (ret)<br>输出结果为:[ 0 , 1 , 4 , 9 , 16 , 25 , 36 , 49 , 64 , 81 ]<br> |
在for的后面可以加条件判断,以满足一些特殊的需求,如:
1 2 | ret = [x * x for x in range ( 10 ) if x % 2 = = 0 ] print (ret)<br>输出结果为:[ 0 , 4 , 16 , 36 , 64 ] |
1 2 | ret = [m + n for m in 'abc' for n in 'xyz' ] print (ret)<br>输出结果为:[ 'ax' , 'ay' , 'az' , 'bx' , 'by' , 'bz' , 'cx' , 'cy' , 'cz' ] |
通过上面的例子,因该不难掌握列表推导式
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步