布尔值不改变值

时间:2012-08-06 19:42:49

标签: python python-2.7

def shoot(self, limb):
    if not limb:
        pass
    else:
        limb = False    


print Joe.body.head #prints out true
Bob.gun.shoot(Joe.body.head) # should print out false
print Joe.body.head #prints out true (???)

我是Python新手,正在制作一款游戏作为LPTHW的一部分。我的拍摄功能应该通过将其设置为false来禁用肢体,但它根本不会编辑布尔值。考虑到我可以直接设置布尔值,这似乎有点多余,但是射击函数将计算的不仅仅是更改布尔值。非常感谢帮助。

3 个答案:

答案 0 :(得分:7)

Python按值传递其对象引用,因此通过执行limb = False,您将为参数False分配值limb的新对象引用,而不是修改最初持有的对象通过参数。 (嗯,从技术上讲,它不是一个“新”引用,因为我相信TrueFalseNone都是Python中的单例。)

然而,这是可行的。

def shoot(self, other, limbstr):
    try:
        if getattr(other, limbstr):     # Levon's suggestion was a good one
            setattr(other, limbstr, False)
    except AttributeError:
        pass   # If the other doesn't have the specified attribute for whatever reason, then no need to do anything as the bullet will just pass by

Bob.gun.shoot(Joe.body, 'head')

答案 1 :(得分:2)

如果你不需要区分不存在的肢体和以前射击过的肢体,这只是对JAB答案的一个小的优化。

def shoot(self, other, limbstr):
    if getattr(other, limbstr, False):
        setattr(other, limbstr, False)

答案 2 :(得分:-1)

在您的代码中,如果limb的值为False,则它会进入无分支(not False)的then分支,并且值保持False。如果limbTrue,则not TrueFalse,并且else分支已激活。这样,limb被分配了False。无法在这段代码中获得True

limb是对False的引用。即使limb的自动解除引用值为True,传递给函数的原始变量仍将引用原始True对象。原因是布尔值是不可变的。对limb的任何分配仅更改引用的值。但外部参考因此独立于内部参考。

如果您想从函数中获取值,最简单的方法是返回它。或者你必须将引用传递给可变的对象。

shoot()方法的设计也很糟糕。它获取布尔值,假设它是肢体的新值。但是,head的值已通过。完全混乱永远不会产生预期的结果。 Joe.body.headTrueFalse传递给Bob.gun.shoot()gun.shoot()期望得到什么?