Python - 变量问题
抱歉如果这个问题听起来很简单,但我对Python还比较陌生,现在完全搞不懂。我在我正在做的程序中,遇到了让变量按我想要的方式工作的困难。
这里有一个我快速制作的例子,来展示我的问题:
life = 200
def example(dudeHP):
dudeHP = dudeHP - 75
print (dudeHP)
example(life)
print (life) #output is 200, but I want it to be 125
如你所见,我试图在def example这个代码块中改变全局变量“life”的值,而dudeHP(如果我没记错的话,这应该是一个局部变量)
这样做可行吗?有没有更好的方法来实现这个?还是我完全搞错了?提前谢谢你们 :)
5 个回答
顺便说一下,这个问题并不是专门针对Python3的,除非新手被标题搞糊涂了。其实这是一个关于Python语言的一般性问题。
你需要理解Python中变量的作用范围和性质。变量其实就是用来存放某些值的名字,它们的生命周期只在定义它们的代码块内。不过,内部代码块的变量可以访问外部代码块的变量。你定义的函数有自己的作用范围和自己的栈来维护,而你传递给这个函数的是变量的一个副本。
处理这个问题的最好方法是从函数中返回值,正如其他回答所提到的。
话虽如此,如果你真的想以全局的方式访问变量,可以这样做。
a = 200
def example(b):
global a
a = a - 25
example(a)
print a
但这样做是不被推荐的,风格也不好。还有一种技巧你可以使用,但这超出了初学者的水平,方法是这样的:
a = [200]
def example(a):
a[0] = a[0] - 25
example(a)
print a[0]
如果你采用这种方式,很容易出错。
不过,正确的做法还是:
a = 200
def example(b):
return b - 25
print example(a)
根据Ned Batchelder和Kristoff的提示,建议使用类,这里有一种方法可以做到这一点:
class Dude:
def __init__(self, hp=200):
self.hp = hp
def eat(self):
self.hp = self.hp + 25
def example(dude):
dude.hp -= 75
hero = Dude()
example(hero)
hero.eat()
print(hero.hp) # 150
除非你有很好的理由让example
成为一个独立的函数,否则你应该把它作为Dude
类的一个方法,就像eat
一样,因为example
显然是作用于一个Dude
类的对象,并且在某种意义上它是这个对象的一部分。
首先,你可能会想在某个时候写一个类或者其他东西来把这些东西整理一下。在函数或者方法里修改全局变量通常被认为是不太好的做法。
你可以试试这样做:
life = 200
def example(x):
return x - 75
life = example(life)
当然,在这个情况下,减法操作非常简单,所以你不需要把它放在一个函数里。