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来禁用肢体,但它根本不会编辑布尔值。考虑到我可以直接设置布尔值,这似乎有点多余,但是射击函数将计算的不仅仅是更改布尔值。非常感谢帮助。
答案 0 :(得分:7)
Python按值传递其对象引用,因此通过执行limb = False
,您将为参数False
分配值limb
的新对象引用,而不是修改最初持有的对象通过参数。 (嗯,从技术上讲,它不是一个“新”引用,因为我相信True
,False
和None
都是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
。如果limb
为True
,则not True
为False
,并且else
分支已激活。这样,limb
被分配了False
。无法在这段代码中获得True
。
limb
是对False
的引用。即使limb
的自动解除引用值为True
,传递给函数的原始变量仍将引用原始True
对象。原因是布尔值是不可变的。对limb
的任何分配仅更改引用的值。但外部参考因此独立于内部参考。
如果您想从函数中获取值,最简单的方法是返回它。或者你必须将引用传递给可变的对象。
shoot()
方法的设计也很糟糕。它获取布尔值,假设它是肢体的新值。但是,head
的值已通过。完全混乱永远不会产生预期的结果。 Joe.body.head
或True
或False
传递给Bob.gun.shoot()
。 gun.shoot()
期望得到什么?