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不同?有大佬路过可以帮忙解答一下!

发布了131 篇原创文章 · 获赞 81 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/weixin_43469047/article/details/103357805
今日推荐