python不能使用函数来更改变量的值

python不能使用函数来更改变量的值,python,function,Python,Function,我对python相当陌生,我想知道为什么函数和if语句在下面的代码中返回“100”而不是“83”。我不确定我是否遗漏了一些明显的东西,但它似乎应该起作用 您必须将attack1的返回值分配给playerhp: def attack1(x): x = (x - 17) return x playerhp = 100 while playerhp > 0: enemyattack = input("please type the word 'attack': ")

我对python相当陌生,我想知道为什么函数和if语句在下面的代码中返回“100”而不是“83”。我不确定我是否遗漏了一些明显的东西,但它似乎应该起作用


您必须将
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

下面是代码的一个工作示例:

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

但是关于你的问题,最重要的是你真正了解传递参数是如何工作的,有很多网站解释说,正如上面的评论所提到的,这个问题归结为范围问题。尝试用谷歌搜索更多信息,但我会尝试在这里给初学者一个解释

声明变量时,它存在于特定范围内,并且只能由相同或更低范围内的变量访问。比如说,

var1 = 5
if var1 < 6:
   print(var1)
   var2 = 7
print(var2) #error on this line
取新的数字,比以前少17,并将其重新指定为原始值,因此它采用此新值

根据其他答案的建议进行编辑

有些人建议直接修改全局变量。(我在这里假设Python3,我不知道您使用的是哪个版本,或者Python2是否有所不同),您可以这样做。Python在函数范围之外有点滑稽,但重写攻击函数很简单,如下所示:

def attack1():
   global playerhp
   playerhp -= 17 #shortcut to subtract 17, same as playerhp = playerhp - 17
你可以简单地用

attack1()

它将以同样的方式工作。如果可以避免的话,许多程序员会避免使用全局变量,但这是非常主观的,他们会为此奋斗一整天,直到时间的尽头

实现这一目标有两种方法

方法1: 根据
attack1()
返回的值更新
playerp
的值。例如:

>>> playerhp = 100
>>> def attack1(x):
...     return x -= 17
... 
>>> playerhp = attack1(playerhp)
>>> playerhp
83
方法2:不要将
x
作为参数传递给
attack1()
。在函数中使用
global playerhp
,例如:

>>> playerhp = 100
>>> def attack1():
...     global playerhp
...     playerhp -= 17
... 
>>> attack1()
>>> playerhp
83

代码是文本;请在这里复制并粘贴该文本。屏幕截图不合适。您的函数不会修改该全局对象,如果您理解其后果,您也不会希望修改该全局对象。请尝试阅读Python教程,以便了解作用域。@MrN3MESIS否。不要在注释中发布代码。你真的期望人们去读吗?把它贴在原来的问题上。最简单的方法就是从你的文本编辑器中复制粘贴,然后突出显示你粘贴的内容,然后按control键(我现在就要这么做了,谢谢你的建议:)还有,Martijn Peters,我刚刚注册了这个论坛,我可以问一下为什么截图不合适吗?@MrN3MESIS for The future,尽量让你的问题在这个网站上保持独立,不是每个人都想关注链接。另外,如果我们需要运行您的示例,我们不能将粘贴代码从图像复制到IDE中,重新键入它会很痛苦。那样你会得到更少的帮助。您可以将代码粘贴到问题中,突出显示所有问题,然后按Ctrl+K(或按编辑区域上方的“代码”按钮)对其进行格式化。这很有意义,谢谢。请允许我问一下,为什么您更改了变量的赋值位置,这只是一种良好的做法吗?我这样说正确吗?没有将“attack1(playerhp)”赋值给变量“playerhp”,我只是有效地更改了函数中playerhp的值作为参数,而不是其他参数,这意味着print语句忽略了这一点,只是在第一次分配playerhp时将其打印出来?它与范围相关。调用
attack1(x)
时,将
playerhp
的副本传递给更新的函数。但是
playerhp
的实际值保持不变。因此,为了更新值,您必须在函数返回值后更新
playerhp
,或者使用与
global
@MrN3MESIS相同的函数内变量引用,正如Moinuddin刚才所说。正如我在回答中所说,谷歌“通过值传递”和“通过引用传递”,并找出Python使用哪一种。这是每种编程语言都需要理解的关键信息。提示:您的
x
未修改
playerhp
的值,建议按值传递。太棒了,看起来我有一些阅读要做,感谢Moinuddin和Cody的帮助。
>>> playerhp = 100
>>> def attack1(x):
...     return x -= 17
... 
>>> playerhp = attack1(playerhp)
>>> playerhp
83
>>> playerhp = 100
>>> def attack1():
...     global playerhp
...     playerhp -= 17
... 
>>> attack1()
>>> playerhp
83
#this works for me. You were not printing the result of the function. 
def attack1(x):
    return(x-17)

playerhp=100
while playerhp>0:
    enemyattack= input("Please type the word 'attack':")
    if enemyattack.upper()=="ATTACK":
        x=attack1(playerhp)
        print (x)

    else:
        break