Python:改变函数参数的值

时间:2017-09-25 11:41:17

标签: python python-3.x tkinter

我目前正在使用python tkinter库制作一个RPG风格的游戏。 我正在努力研究战斗系统但是我遇到了破坏性系统的问题

我正在尝试将函数中的变量更改为参数,但当然我不能这样做..我已经尝试过查看其他解决方案而且由于tkinter的工作原理它们根本无济于事与其他代码不同。

这是我的代码:

def Attack(EnemyHP,EnMax,GuiEnemyHP,EnemyHPBar,Width):
    Dmg = AtkDmg()
    EnemyHP = EnemyHP - Dmg
    GuiEnemyHP['text'] = Enemy + ": " + str(EnemyHP)+ '/' + str(EnMax)
    Loss = (Width / EnMax) * Dmg
    Width = EnemyBar_Width - Loss
    EnemyBar.place(x=110,y=0,width=Width,height=20)

3 个答案:

答案 0 :(得分:2)

如果你继续这样做,你的代码将变得非常混乱。

Python是一种面向对象的语言,因此您可能应该使用类和实例来描述它们之间的字符和交互。

这是角色的一个非常基本的实现:

class Character:
    def __init__(self, name, hp_max):
        self.name = name
        self.xp = 0
        self.hp_max = hp_max
        self.hp = hp_max
        # TODO: define hp_bar here

    def is_dead(self):
        return self.hp <= 0

    def attack(self, opponent, damage):
        opponent.hp -= damage
        self.xp += damage

    def __str__(self):
        return '%s (%d/%d)' % (self.name, self.hp, self.hp_max)

hero = Character('Mario', 1000)
enemy = Character('Goomba', 100)

print(enemy)
# Goomba (100/100)

hero.attack(enemy, 50)
print(enemy)
# Goomba (50/100)

hero.attack(enemy, 50)

print(enemy)
# Goomba (0/100)
print(enemy.is_dead())
# True
print(hero.xp)
# 100

答案 1 :(得分:0)

据我所知,对象作为引用被传递,因此你可以在函数内修改它们。正如其他人所指出的那样,即使将对象作为参数传递的pythonic方式也不是通过引用,它可以从函数内部改变对象的属性。

如果您不想创建对象,另一种绕过此限制的方法是传递列表,因为它们是可变的 - 您可以替换函数内的列表项,然后调用者将看到新修改的列表函数返回时,元素而不是旧元素。 (虽然不是一个好的解决方案。)

答案 2 :(得分:0)

正如您已经注意到的,在函数中重新绑定参数不会像您预期的那样在这里工作,因为参数名称是函数的本地。这为您提供了两种解决方案:

功能方式:从函数中返回新的/更新的值:

def foo(arg1, arg2, argN):
    arg1 += 42
    arg2 = arg1 + argN
    argN -= arg2
    return arg1, arg2, argN

arg1, arg2, argN = foo(arg1, arg2, argN)

OO方式:传递一个可变对象并改变它:

class Arg(object):
    def __init__(self, arg1, arg2, argN):
        self.arg1 = arg1
        self.arg2 = arg2
        self.argN = argN


def foo(arg):
    arg.arg1 += 42
    arg.arg2 = arg.arg1 + arg.argN
    arg.argN -= arg.arg2


arg = Arg(x, y, z)
foo(arg)
# now arg.arg1, arg.arg2 and arg.argN have been updated
# - but NOT x, y and z which are untouched

请注意,在第二个示例中,更好的设计是让Arg上的方法执行有效更新,并直接使用此方法或(如果需要)从foo()调用它。 / p>

作为旁注:我发现你的Attack函数中发生了很多不相关的事情 - 至少有一部分是域相关的(计算损坏和更新EnemyHP)而另一部分是演示文稿相关(更新GuiEnemyHPEnemyBar)。这两个部分可以在应用程序的两个不同层中得到更好的处理(分别是模型层 - 它不应该对表示有任何了解 - 以及UI层)。