python无法使用函数来更改变量的值

时间:2016-08-23 21:23:24

标签: python function

我对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

4 个答案:

答案 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 valuepassing 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