python run報的錯與debug報錯位置不一樣

今天一個學弟問我一個問題,問他寫的代碼爲什麼報錯了?
我大概看了一下,感覺很容易糾錯,不就是一個簡單排序嘛,但還是先運行了一遍。

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()

最後說一下,這篇文章重點不是這個代碼,而是拋出了一個奇怪的現象,爲什麼run的報錯位置很不符合正常邏輯,也和debug不同?有大佬路過可以幫忙解答一下!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章