今天一个学弟问我一个问题,问他写的代码为什么报错了?
我大概看了一下,感觉很容易纠错,不就是一个简单排序嘛,但还是先运行了一遍。
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()