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割り当てます。(技術的には、これは「新しい」参照ではありません。私が信じているように、 、、およびはすべて Python のシングルトンです。)FalselimbTrueFalseNone

ただし、これは機能するものです。

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

あなたのコードでは、 if limbhas value Falsethen は何もしない then ブランチに入り ( not False)、値はそのままになりますFalse。である場合は、ブランチがlimbアクティブTrue化されます。このように、が割り当てられます。このコードに入る方法はありません。not TrueFalseelselimbFalseTrue

limbへの参照Falseです。の値が自動的に逆参照limbTrueれたとしても、関数に渡された元の変数は元のTrueオブジェクトを参照します。その理由は、ブール値が不変であるためです。のみへの割り当てlimbは、参照の値を変更します。ただし、外部参照は内部参照に依存しません。

関数から値を取得したい場合、最も簡単な方法はそれを返すことです。または、変更可能なオブジェクトへの参照を渡す必要があります。

shoot()メソッドの設計にも問題があります。それが四肢の新しい値であると仮定して、ブール値を取得します。ただし、 の値headは渡されます。完全な混乱は決して期待される結果を生み出しません。はJoe.body.headまたはTrueまたはFalseに渡されBob.gun.shoot()ます。何をgun.shoot()期待していますか?

于 2012-08-06T20:04:24.650 に答える