我是python的新手,想知道为什么函数和if语句在下面的代码中返回“ 100”而不是“ 83”。我不确定是否遗漏了一些明显的东西,但似乎应该可以使用。这是我指的代码:
playerhp = 100
def attack1(x):
x = (x - 17)
return x
while playerhp > 0:
enemyattack = input("please type the word 'attack': ")
if enemyattack.upper() == "ATTACK":
attack1(playerhp)
print(playerhp)
else:
break
正如上面评论中提到的那样,这个问题归结为范围界定。尝试使用Google搜索,以获取更多信息,但我将在此处尝试提供初学者级别的解释。
声明变量时,它存在于特定作用域中,并且只能由相同或较低作用域中的变量访问。例如,
var1 = 5
if var1 < 6:
print(var1)
var2 = 7
print(var2) #error on this line
var1
在此示例中存在于最高范围,因此较低的范围可以访问,因此该print(var1)
行工作正常。但是,var2
它的作用域比尝试打印它的语句更大,因此它找不到该变量。由于Python强制采用良好的格式,因此您可以将范围大致视为缩进的每个级别。如果必须去缩进的部分可以找到它,但是如果需要去缩进的部分可以找到它,那么就找不到。
这扩展到功能。您的函数attack1
与while循环内部的作用域不同,并且变量x
仅存在于该函数内。因此,当您修改时x
,它只会在该范围内进行修改,而不是原始范围。这超出了您最初提出的问题的范围,但是请查询含义passing by value
和passing by reference
含义,以及它们如何适用于Python。正如其他答案指出的那样,您可以通过将return value
x的x分配给您要传递的原始数字来解决此问题,即
playerhp = attack1(playerhp)
取新的数字(比原来少17个数字),然后将其重新分配为原始值,因此它将采用该新值。
根据其他答案的建议进行编辑
有人建议直接修改全局变量。(我在这里假设使用Python 3,我不知道您使用的是哪个版本,或者Python 2甚至不一样),您可以执行此操作。Python对于范围外的功能有点可笑,但是像这样重写攻击函数很简单:
def attack1():
global playerhp
playerhp -= 17 #shortcut to subtract 17, same as playerhp = playerhp - 17
你可以简单地用
attack1()
它将以相同的方式工作。如果可以避免的话,许多程序员会避免使用全局变量,但这是非常主观的,他们将一整天都在为此而斗争,直到时间结束。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句