Python 旁路条件

Python 旁路条件,python,python-3.x,if-statement,while-loop,Python,Python 3.x,If Statement,While Loop,有人能理解为什么下面的代码失败吗 def main(A): A.sort() B = A[:] ll = len(B) while ll > 1: for i in range(ll): for n in range(i + 1, ll): if (B[i] + B[n]) % 2 == 0: B.remove(B[n])

有人能理解为什么下面的代码失败吗

def main(A):
    A.sort()
    B = A[:]
    ll = len(B)
    while ll > 1:
        for i in range(ll):
            for n in range(i + 1, ll):
                 if (B[i] + B[n]) % 2 == 0:
                    B.remove(B[n])
                    B.remove(B[i])
                    main(B)
    return B
if __name__ == '__main__':
    result = main([4, 5, 3, 7, 2])
    print(result)

它运行ok,直到我的列表只有一个值,到达“returnB”语句,然后再次跳回循环。我遗漏了什么?

您正在使用递归,在循环中再次调用
main(B)
。当递归调用返回时,调用它的循环将继续

此外,您将忽略递归调用的返回值。由于在每次调用
main()
时都使用列表的副本,因此忽略返回值意味着放弃递归调用所做的所有工作

最后但并非最不重要的一点是,您正在从
B
中删除元素;循环将遇到索引错误,因为
i
n
的范围都是
ll
,删除元素后该长度不再有效。由于您无法更新正在循环的
range()
对象;您必须使用
while
循环来测试每次迭代的长度:

i = 0
while i < len(B):
    n = i + 1
    while n < len(B):
        if (B[i] + B[n]) % 2 == 0:
            del B[n], B[i]
            break
        else:
            n += 1
    else:
        i += 1

您正在递归,调用
main(B)
并忽略返回值。由于您每次都要复制
a
,因此忽略返回值很重要。我在回答中列举了几个原因,说明您的代码可能会“失败”。要获得更详细的答案,包括找到有效解决方案的任何机会,请在您的问题中包含适当的答案;错误和预期结果的完整回溯,即函数应该做什么。非常好的洞察力。谢谢Martijn Pieters。在代码“忽略”返回值并再次跳入循环之前,我没有索引错误。再次感谢您的帮助。@Vagelisprokopou:那只是因为您还没有达到外部循环中的索引错误条件。它也会到达那里。
>>> def main(A):
...     B = sorted(A)
...     i = 0
...     while i < len(B):
...         n = i + 1
...         while n < len(B):
...             if (B[i] + B[n]) % 2 == 0:
...                 del B[n], B[i]
...                 break
...             else:
...                 n += 1
...         else:
...             i += 1
...     return B
...
>>> main([4, 5, 3, 7, 2])
[7]