首先舉個例子:
l=[1,1,1,2,3,4,5]
for i in l:
if i%2!=0: #把list中的奇數刪除
l.remove(i)
print(l) #但是執行結果是[1, 2, 4],有奇數沒被刪掉。
#所以可以看出,迴圈刪list的時候會導致下標錯位,結果是不對的。
原因:l=[1,1,1,2,3,4,5]
#0 1 2 3 4 5 6 (這裡是對應的下標。)list根據下標取值操作。
#1,1,2,3,4,5 第乙個下標是0,1/2的餘數不是0,所以第乙個1刪掉,然後執行下標為1的,
# 但是此時原0位已經刪掉看,後面順序進製。第二個1的下標變成0,就被越過了。
解決方法:
l=[1,1,1,2,3,4,5]
l2=[1,1,1,2,3,4,5] #這樣定義的兩個id位址是不一樣的。
for i in l2: #迴圈l2,但是刪的時候刪l的內容。l2沒改變過,所以下標也不會錯位,所以刪的l是顯示正確的。
if i%2!=0:
l.remove(i)
print(l)
#list刪除有兩種:remove刪除的是元素,pop刪除的是下標
另一種,如果直接l2=l,這樣執行結果也是[1, 2, 4]
l=[1,1,1,2,3,4,5]
l2=l #淺拷貝
print(id(l))
print(id(l2)) #l2=l這樣賦值是淺拷貝,列印出來的id位址是一樣的
l2=copy.deepcopy(l) #這樣賦值是深拷貝,列印出來的id位址是不一樣的。相當於在記憶體中重新開闢了乙個地方儲存。
l2=l.copy() #淺拷貝
#淺拷貝id位址是一樣的,所以list刪除都是錯誤的。深拷貝id位址不同,list刪除是迴圈乙個,刪另乙個。這樣比較亂,所以list不要用迴圈刪除。
Python學習筆記 2 4章 遞迴函式
這是學習廖雪峰老師python教程的學習筆記 在函式內部,可以呼叫其他函式。如果乙個函式在內部呼叫自身本身,這個函式就是遞迴函式。使用遞迴函式寫乙個階乘函式 def fact n if n 1 return 1 return n fact n 1 計算過程 fact 5 5 fact 4 5 4 f...
C 學習筆記 24
volatile關鍵字是一種型別修飾符,用它宣告的型別變數表示可以被某些編譯器未知的因素更改,比如 作業系統 硬體或者其它執行緒等。由於訪問暫存器的速度要快過ram,所以編譯器一般都會作減少訪問外部ram的優化。遇到這個關鍵字宣告的變數,編譯器對訪問該變數的 就不再進行優化,從而可以提供對特殊位址的...
學習進度筆記24
今天完成了老師布置的tensorflow實驗4 實驗目的 1.掌握使用 tensorflow 進行knn 操作2.掌握 knn 演算法的原理 實驗原理 knn的基本原理 knn是通過計算不同特徵值之間的距離進行分類。整體的思路是 如果乙個樣本在特徵空間中的k個最相似 即特徵空間中最鄰近 的樣本中的大...