<p>正如上面的评论所提到的,这个问题归结为范围界定。尝试谷歌搜索更多信息,但我会尝试给一个初学者的解释在这里。你知道吗</p>
<p>声明变量时,它存在于特定的作用域中,并且只能由同一作用域或更低作用域中的变量访问。例如</p>
<pre><code>var1 = 5
if var1 < 6:
print(var1)
var2 = 7
print(var2) #error on this line
</code></pre>
<p>在本例中,<code>var1</code>存在于最高的作用域中,因此较低的作用域可以访问它,因此<code>print(var1)</code>行可以正常工作。但是,<code>var2</code>的作用域比试图打印它的语句的作用域高,因此它找不到变量。由于Python强制使用很好的格式,所以可以将范围大致看作缩进的每个级别。如果你必须去一个缩进更多的部分,它可以找到它,但如果你需要通过一个缩进更少的部分找到它,那么你不能</p>
<p>这扩展到函数。函数<code>attack1</code>的作用域与while循环中的作用域不同,变量<code>x</code>只存在于该函数中。因此,当您修改<code>x</code>时,它只在该范围内修改它,而不是在原始范围内修改它。这超出了您最初问题的范围,但请查看<code>passing by value</code>和<code>passing by reference</code>的含义,以及它们如何应用于Python。正如其他答案所指出的,您可以通过将x的<code>return value</code>分配给您要传递的原始数字来解决这个问题,即</p>
<pre><code>playerhp = attack1(playerhp)
</code></pre>
<p>取一个比原来少17的新数字,并将其重新指定为原始值,因此它将采用这个新值。你知道吗</p>
<p><strong>编辑其他答案的建议</p>
<p>有些人建议直接修改全局变量。(我在这里假设python3,我不知道您使用的是哪个版本,或者python2是否有所不同),您可以这样做。Python在确定函数范围方面有点滑稽,但重写攻击函数很简单,如下所示:</p>
<pre><code>def attack1():
global playerhp
playerhp -= 17 #shortcut to subtract 17, same as playerhp = playerhp - 17
</code></pre>
<p>你可以简单地用</p>
<pre><code>attack1()
</code></pre>
<p>它也会以同样的方式工作。如果可以避免的话,许多程序员会回避使用全局变量,但这是非常主观的,他们会为此奋斗一整天,直到时间的尽头。你知道吗</p>