今天一個學弟問我一個問題,問他寫的代碼爲什麼報錯了?
我大概看了一下,感覺很容易糾錯,不就是一個簡單排序嘛,但還是先運行了一遍。
def fun():
before_li = [1, 5, 2, 21, 3, 6, 24, 12, 7, 11]
after_li = []
active = True
while active:
if before_li == []:
active = False
after_li.append(min(before_li))
before_li.remove(min(before_li))
print(after_li)
fun()
結果運行出的錯位置讓我感覺很奇怪(我本認爲是結束條件後沒跳出邏輯才報錯,但是爲什麼報錯信息不再最後呢?),我又加了點print輸出信息重新run了一遍,得到了下面的運行報錯結果:
然後我又run了幾次,發現報錯的位置竟然不一樣!!!(這裏只擺一張圖,大家可以自己試試)
後來我實在受不了了,用debug(下面是bebug使用的代碼)
def fun():
before_li = [1, 5, 2, 21, 3, 6, 24, 12, 7, 11]
after_li = []
i = 0
while True:
if before_li == []:
break
print("第%d次"%i)
print("min of before_li=%s"%min(before_li))
after_li.append(min(before_li))
before_li.remove(min(before_li))
print("before_li: ", before_li)
i+=1
print(after_li)
fun()
debug結果如圖,終於是我想象中的報錯和結果了!果然是條件結束後未及時跳出的邏輯錯誤。
下面是正確代碼:
def fun():
before_li = [1, 5, 2, 21, 3, 6, 24, 12, 7, 11]
after_li = []
active = True
i = 0
while active:
if before_li == []:
# active = False
break
# for i in range(10):
print("第%d次"%i)
print("min of before_li=%s"%min(before_li))
after_li.append(min(before_li))
before_li.remove(min(before_li))
print("before_li: ", before_li)
i+=1
print(after_li)
fun()