python程式設計第一課
阿新 • • 發佈:2019-01-29
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('第二次修改後相等')
執行發現若修改後二者就不相等,記憶體執行過程如: