上記のコメントに記載されているとおり、この問題はスコープになります。詳細については、グーグルで試してみてください。しかし、ここでは初心者レベルの説明をしようとします。
変数を宣言するとき、変数は特定のスコープ内に存在し、同じまたは低いスコープの変数によってのみアクセスできます。例えば、それは下のものにアクセスできるように
var1 = 5
if var1 < 6:
print(var1)
var2 = 7
print(var2) #error on this line
var1
は、この例では、最も高い範囲内に存在するので、print(var1)
ラインが正常に動作します。ただし、var2
は、印刷しようとしている文よりも高い範囲にあり、変数を見つけることができません。 Pythonは良い書式設定を強制するので、インデントの各レベルとしてスコープを広く考えることができます。インデントされたセクションに移動する必要がある場合は、それを見つけることができますが、インデントされていないセクションを検索する必要がある場合は、検索できません。
これは機能にまで及ぶ。あなたの関数attack1
は、あなたのwhileループの内部とは異なるスコープに存在し、変数x
はその関数内にのみ存在します。したがって、x
を変更すると、元のスコープでは変更されません。あなたの元の質問の範囲を超えていますが、passing by value
とpassing by reference
の意味とそれらがPythonにどのように適用されるかを調べてください。他の回答が指摘するように、あなたはすなわち
playerhp = attack1(playerhp)
は、新しい番号を取るために、あなたが渡している元の数にxのreturn value
を割り当てることによってこの問題を解決することができ、それがあること、そしてそれを再割り当てするために使用されるよりも少ない17元の値に戻すので、代わりにこの新しい値を引き継ぎます。他の回答は、一部の人々は、直接グローバル変数を変更することをお勧め
を示唆するものにに関して
編集。 (ここではPython 3と仮定していますが、どのバージョンを使用しているのか、Python 2が異なるのか分かりません)、あなたはそれを行うことができます。 Pythonは機能のうち、スコープについて少しおかしいですが、このようなあなたの攻撃機能を書き換えることは簡単です:
def attack1():
global playerhp
playerhp -= 17 #shortcut to subtract 17, same as playerhp = playerhp - 17
、あなたは単に
attack1()
でそれを呼び出すことができ、それは同じように動作します方法。あなたがそれを避けることができれば、多くのプログラマーはグローバル変数の使用を躊躇しますが、それは非常に主観的で、時間の終わりまでそれについて終日戦います。
コードがテキストです。そのテキストをここにコピーして貼り付けてください。スクリーンショットは適切ではありません。 –
あなたの関数は、そのグローバルオブジェクトを修正するつもりはなく、分かり易さを理解していても欲しくないでしょう。スコープについて理解するために、Pythonチュートリアルを読んでみてください。 –
@ MrN3MESISいいえコメントにあなたのコードを載せてはいけません。あなたは実際に人々がそれを読むことを試みることを期待していますか?元の質問に投稿してください。一番簡単なのは、テキストエディタからコピー&ペーストして貼り付けたものを強調表示し、control-kを押すことです。 –