python编程第一课

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('第二次修改后相等')

运行发现若修改后二者就不相等,内存运行过程如:
这里写图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值