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永远都是一样的,只要修改,就需要再创建一个
对于列表、元组、字典等其他来说,浅拷贝只拷贝最外面一层,深拷贝比较彻底,但最后一层(最底层的字符串,数字)不拷贝

 列表推导式

列表推导式又叫列表生成式,由名字不难看出,得出的结果是一个列表。

当然生成一个列表也可以有别的一些方法,但是通过列表推导式可以写出很简洁的代码

如:

ret = [x*x for x in range(10)]
print(ret)
输出结果为:[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

  在for的后面可以加条件判断,以满足一些特殊的需求,如:

ret = [x*x for x in range(10) if x%2 == 0]
print(ret)
输出结果为:[0, 4, 16, 36, 64]

  

ret = [m + n for m in 'abc' for n in 'xyz']
print(ret)
输出结果为:['ax', 'ay', 'az', 'bx', 'by', 'bz', 'cx', 'cy', 'cz']

  通过上面的例子,因该不难掌握列表推导式

三样东西有助于缓解生命的疲劳:希望、睡眠和微笑。---康德
原文地址:https://www.cnblogs.com/ronghe/p/8358149.html