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