1. 程式人生 > >python程式設計第一課

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

執行發現若修改後二者就不相等,記憶體執行過程如:
這裡寫圖片描述