擅长:python、mysql、java
<p>在不讨论代码的具体问题的情况下,正如您所说的那样,我将对标题中的实际问题给出一个简短的回答</p>
<blockquote>
<p>What could be wrong and how can I find [the errors in my code]?</p>
</blockquote>
<p>与其把你的代码当作一个大而复杂的函数,你必须一次盯着它看并理解它(我很少能一次在自己的内部大脑缓存中保存超过10行的代码),不如试着把它分解成更小的部分“首先,我这样做并期望得到这样的结果。然后我得到这个结果,对它做这个,并期待另一个结果。”</p>
<p>从您对问题的描述来看,您似乎已经这样想了,但是您仍然丢弃了这一大块代码,并且似乎正在努力找出问题的确切位置。很多初学者会编写一大堆代码,然后在测试时将其视为黑盒。比如“我没有得到正确的答案,我不知道问题从哪里开始。”这就是学习良好的调试技能的关键所在。你知道吗</p>
<p>我首先将事情分解成更小的部分,在交互式Python提示符下进行尝试。为不同的变量输入虚拟值,并确保小的代码片段(1到5行左右,小到很容易推理)与您期望的对不同变量值的处理完全一致。你知道吗</p>
<p>如果这样做没有帮助,那么对于初学者和高级开发人员来说,一种行之有效的方法就是用print语句来迷惑代码。在您认为必要的地方,放置一个语句来打印一个或多个变量的值。就像<code>print("exp = %s; result = %s" % (exp, result)</code>。在执行过程中跟踪某些变量的值时,尽可能多地放一些这样的东西。看看它从哪里开始给出毫无意义的答案。你知道吗</p>
<p>但有时这很难做到。您可能猜不到放置<code>print</code>语句的最有效位置,甚至猜不到要打印的重要内容。在这种情况下(大多数情况下是IMO),使用像Python内置的<code>pdb</code>这样的交互式调试器更有效。有很多很好的资源可以学习<code>pdb</code>,但是基础知识不应该花费太长的时间,而且可以帮你省去很多麻烦。你知道吗</p>
<p><code>pdb</code>将逐行运行代码,在每一行之后停止(在循环中,它将通过循环遍历每一个循环),允许您在前进到下一行之前检查每个变量的内容。这使您完全有能力检查代码的每个部分是否做了您期望的事情,并且应该帮助您确定许多问题区域。你知道吗</p>