我对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
答案 0 :(得分:2)
您必须将attack1
的返回值指定为playerhp
:
def attack1(x):
x = (x - 17)
return x
playerhp = 100
while playerhp > 0:
enemyattack = input("please type the word 'attack': ")
if enemyattack.upper() == "ATTACK":
playerhp = attack1(playerhp)
print(playerhp)
else:
break
答案 1 :(得分:0)
以下是您的代码的工作示例:
playerhp = 100
def attack1(x):
x = (x - 17)
return x
while playerhp > 0:
enemyattack = input("please type the word 'attack': ")
if enemyattack.upper() == "ATTACK":
playerhp = attack1(playerhp)
print(playerhp)
else:
break
但对你的问题最重要的是你真的明白传递论证是如何运作的,有很多网站在解释这些,这里只是one
答案 2 :(得分:0)
正如上面的评论所述,这个问题归结为范围界定。尝试谷歌搜索更多信息,但我会尝试在这里给出一个初级水平的解释。
声明变量时,它存在于特定范围内,并且只能由相同或较低范围内的变量访问。例如,
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指定为您传入的原始数字来解决此问题,即
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()
它将以相同的方式工作。如果你可以避免使用全局变量,许多程序员会回避使用全局变量,但这是非常主观的,并且他们将整天打架,直到时间结束。
答案 3 :(得分:0)
有两种方法可以实现它。
方法1 :
根据{{1}}的值返回值更新playerhp
的值。例如:
attack1()
方法2 :不要将>>> playerhp = 100
>>> def attack1(x):
... return x -= 17
...
>>> playerhp = attack1(playerhp)
>>> playerhp
83
作为参数传递给x
。而是在函数中使用attack1()
,如:
global playerhp