4
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 来禁用肢体,但它根本不编辑布尔值。考虑到我可以直接设置布尔值,这可能看起来有点多余,但拍摄功能将计算的不仅仅是更改布尔值。帮助将不胜感激。

4

3 回答 3

7

Python 按值传递其对象引用,因此通过这样做,limb = False您将带有值的新对象引用分配给False参数limb,而不是修改参数最初持有的对象。(嗯,从技术上讲,它不是一个“新”参考,我相信True,FalseNone都是 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')
于 2012-08-06T19:46:32.803 回答
2

如果您不需要区分不存在的肢体和之前拍摄的肢体,这只是对 JAB 答案的一个小优化。

def shoot(self, other, limbstr):
    if getattr(other, limbstr, False):
        setattr(other, limbstr, False)
于 2012-08-06T19:59:35.937 回答
-1

在您的代码中,如果limb具有值,False则它进入不执行任何操作的 then 分支 ( not False),并且值保持不变False。If limbis Truethen not TrueisFalse并且else分支被激活。这样,limb被赋值False。没有办法进入True这段代码。

是对的limb引用False。即使 are 的自动取消引用值,传递给函数limbTrue原始变量仍将引用原始True对象。原因是布尔值是不可变的。对 only 的任何赋值都会limb更改引用的值。但是外部参考独立于内部参考。

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

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

于 2012-08-06T20:04:24.650 回答