Python第一课
编写产品犹如在北京建设一栋大楼,为了利益和效率最大化,考虑代码执行周期和效率
内存回收机制
待续
时间复杂度
列表的常规操作:增、删、改、查、排序,在任何一个操作,考虑其时间复杂度,数据在内存中的时间消耗,如学校学生名单的列表共计20000条数据,此数据全部放置内存中,若对此列表进行sort,2000条数据从新排列时间复杂度为O(n*2),所以考虑计算机性能进行编写程序及优化程序代码
列表非常规操作
sort(key=None,reverse=False) 默认返回None
- key是函数,reverse默认不进行对列表进行翻转
lis1=[1,2,3,c,4,5]
lis2=['a','b']
lis.sort(key=str,reverse=True)
通过内存运行情况可知
list.copy()默认返回新列表
在列表中套用列表或者套用其他函数时注意列表所在内存地址,如下代码:
lis0 = [1,[2,3,4],5]
print(id(lis0))
lis5=lis0.copy()
print(id(lis5))
lis5[2]=10
if lis5 == lis0:
print('第一次相等')
else:
lis5[2]=5
if lis5 == lis0:
print('第一次修改后相等')
lis5[1][1]=300
print(lis0)
print(lis5)
if lis5 == lis0:
print('第二次相等')
else:
lis5[2]=5
if lis5 == lis0:
print('第二次修改后相等')
运行结果为:
140577722877576
140577722877832
第一次修改后相等
[1, [2, 300, 4], 5]
[1, [2, 300, 4], 5]
第二次相等
正常思维知修改lis5[1][1]的值,并未修改lis0[1][1]的值,所以二者数值本不应该相等,但结果背道而驰,原因如下:列表套用列表时,每个列表都会有自己的内存地址,lis5=lis0.copy(),仅仅是将lis0的值复制一份到lis5,但是list=[2,3,4]的内存地址值在lis0和lis5中一直没有发生过变化,已经当修改lis5[1][1]=300时,仅修改的是list=[2,3,4]的值,并未修改list=[2,3,4]的内存地址值,因此lis5=[1,’列表[2,3,4]的内存 地址’,5],lis0=[1,’列表[2,3,4]的内存 地址’,5],因此二者相等,具体可通过内存运行变化图可知:
lis5[1][1]修改前内存运行情况如下:
lis5[1][1]修改后内存运行情况如下:
copy.deepcopy()函数
在列表中套用列表或者套用其他函数时注意列表所在内存地址,如下代码:
import copy
lis0 = [1,[2,3,4],5]
print(id(lis0))
lis5=copy.deepcopy(lis0)
print(id(lis5))
lis5[2]=10
if lis5 == lis0:
print('第一次相等')
else:
lis5[2]=5
if lis5 == lis0:
print('第一次修改后相等')
lis5[1][1]=300
print(lis0)
print(lis5)
if lis5 == lis0:
print('第二次相等')
else:
lis5[2]=5
if lis5 == lis0:
print('第二次修改后相等')
运行发现若修改后二者就不相等,内存运行过程如: