2012-08-06 87 views
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来禁用肢体,但它根本不编辑布尔值。考虑到我可以直接设置布尔值,这看起来可能有点多余,但是射击函数的计算远不止是改变布尔值。帮助将不胜感激。布尔值不变值

+3

不是一个解决方案,但只是一个建议,你的if/else可以减少到'if if:limb = False' – Levon 2012-08-06 19:44:35

+0

@Levon甚至L lambda L:不是L' – 2012-08-06 20:21:32

+0

如果' L'最初是“假”。拍摄已拍摄的肢体并不会突然重新生成,现在呢? – JAB 2012-08-07 11:44:16

回答

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') 
+0

比我想象的更清洁的解决方案(一系列if/elif)。我喜欢。 – Humungus 2012-08-06 19:53:25

2

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

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

哦,我忘了getattr()允许默认结果。当'other'没有'limbstr'指定的属性时,那么确实会比让一个异常产生更有效率。 – JAB 2012-08-06 20:07:42

-1

在你的代码,如果limb有值False然后进入分支,然后什么也不做(not False)和值保持False。如果limbTrue那么not TrueFalse并且else分支被激活。这样,limb被分配为False。没有办法在这段代码中获得True

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

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

也有不好的设计shoot()方法。假设它是肢体的新值,它会得到布尔值。但是,通过了head的值。完全混淆不会产生预期结果。 Joe.body.head是或TrueFalse传递给Bob.gun.shoot()gun.shoot()预计会得到什么?

+2

这并不回答问题,这就是为什么分配给本地参数名称不影响用作该参数参数的对象的值的原因。 – chepner 2012-08-06 20:12:50

+0

已更新,以便初学者可以使用。 – pepr 2012-08-06 20:57:27