Python - 变量问题

时间:2011-08-16 02:46:04

标签: python variables

对不起,如果这是一个显而易见的问题,但我对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

正如你所看到的,我试图用dudeHP在def示例代码块中改变全局变量“life”的值(如果我没弄错的话,这将是一个局部变量?)

这可行吗?有没有更好的方法来实现这一目标?或者我做错了吗?谢谢你提前:))

5 个答案:

答案 0 :(得分:3)

嗯,首先,你可能想要写一个类或某些东西来组织所有这些。从函数或方法中修改全局变量通常被认为是一个坏主意。

您可能想要尝试的是:

life = 200

def example(x):
    return x - 75

life = example(life)

当然,在这种情况下,减法操作非常简单,您无需将其封装在函数中。

答案 1 :(得分:1)

顺便说一下,问题不是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)

答案 2 :(得分:1)

除了Ned Batchelders和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的对象。

答案 3 :(得分:0)

在您的函数中,名称dudeHP是函数的本地名称。当您更改它时,您只是更改本地名称,不能影响传入的名称的值。

您可以将整数作为传入的容器的元素,以便可以更改容器,也可以从函数返回值。

答案 4 :(得分:0)

由于let playerMoves = [0, 1, 4]; let winningCombinations = [ [0, 1, 2], [3, 4, 5], [6, 7, 8], [0, 3, 6], [1, 4, 7], [2, 5, 8], [0, 4, 8], [2, 4, 6], ]; let res = winningCombinations.filter(v => v.filter(c => { return playerMoves.indexOf(c) > -1; }).length == 2); console.log(JSON.stringify(res));在该函数中具有局部范围,因此它不具有该函数之外的生命。因此,使用dudehp来更新生命是非法的,你可以通过使用全局关键字或者像其他人提到的那样恢复价值来做到这一点......希望这种解释很有用,并且可以接受对此的任何更正。