<p>当您执行<code>Maze.content[row][col]</code>时,python会查找名为<code>row</code>和{<cd3>}的变量,并尝试将它们用作<code>Maze.content</code>的索引。由于<code>row</code>(和<code>col</code>)没有在<code>move()</code>中定义,而且它们也不是全局定义的,python抛出一个<code>NameError</code>。在</p>
<p>不过,还有一个问题。即使<em>如果</em>在该行之前设置了<code>row = someNumber</code>和{<cd10>},仍然无法得到预期的结果。
调用<code>Maze.content[row][col]</code>将返回长度为1的字符串。(值为“#”、“@”或“uU”)。因此,对该字符串执行x.count(“@”)将返回1或0。而且由于操作的是长度为1的字符串,<code>num_sprouts_left</code>将只接受1或0的值。在</p>
<p>我假设您希望遍历<em>整个</em>迷宫来计算芽苗菜的数量。你可以这样做:</p>
<pre><code>num_sprouts_left = sum(row.count('@') for row in Maze.content)
</code></pre>
<p>在上面的例子中,<code>row</code><em>在生成器表达式中被分配了一个值。(事实上,它被分配了多个值,每次迭代都有不同的值)</p>
<h3>关于使用<code>Maze</code>或<code>Rat</code>作为<code>self</code>参数的注意事项:</h3>
<p>首先,你称第一个参数是什么并不重要。你可以很容易地做到:</p>
^{pr2}$
<p>这是因为python将<em>类实例</em>作为第一个参数传递。你输入的名字只是一个变量名,这样你就可以在特定的方法中引用它。在</p>
<p><em>但是</em></p>
<p>该参数按惯例称为<code>self</code>。您应该将其称为<code>self</code>,这样可以使代码保持清晰。在</p>
<p>为什么不叫它<code>Maze</code>或者{<cd15>},就像我一直在做的那样?</em>
首先,因为它令人困惑。实际上,您并不是在引用任何方法中的<em>类</em><code>Maze</code>或{<cd15>},python将这些名称分配给<em>类实例</em>。有人(包括您自己)可能会在以后读到您的代码,并认为您引用的是类而不是实例。在</p>
<p>第二,因为它覆盖了该方法中的类名。如果你真的想引用这个方法中的类呢?你不能,因为你用你不好命名的参数重写了这个名字。在</p>