2011-08-16 23 views
-1

申し訳ありませんが、これは明らかな質問ですが、私は比較的新しいPythonであり、現時点で完全に困惑しています。私は自分の変数が私が取り組んでいるプログラムでも同じように働くようになるのが難しいです。ここでPython - 変数の問題

が、私はすぐに私の問題を紹介するためになさ例です。あなたが見ることができるように

life = 200 

def example(dudeHP): 
    dudeHP = dudeHP - 75 
    print (dudeHP) 

example(life) 
print (life) #output is 200, but I want it to be 125 

、私はグローバル変数「人生」の値はとデフの例のコードブロックの内側に変更するために取得しようとしていますdudeHP(私が間違っていなければローカル変数になりますか?)

これは実行可能ですか?これを達成するより良い方法はありますか?あるいは私はそれをすべて間違っているのですか?ありがとうございます:)

+0

Pythonはcall-by-referenceをサポートせず、call-by-valueのみをサポートしています。あなたは '200 'のコピー*を' example() 'に渡しました。これは' life'からではなく' 75 'から差し引いたものです。 –

+3

@Peter No. Pythonはそのようなコピーを作成しません。彼は参照を渡したが、彼は指摘した値を「指差し」または指し示す価値を指し示すことなく新しい値(125)で指摘した。 – agf

+0

@agf '' dudehp''に新しい値を指すのではなく、新しい**オブジェクト**にします。実際、AFAIは理解しているように、識別子 '' dudehp''はシンボルテーブル内の一種のポインタにバインドされています(Pythonでは、 '参照'という言葉が好まれていますが、なぜか分かりません)変わらない。唯一変化するのは、識別子が間接的に指し示すオブジェクトのアドレスである '' dudehp''に関連する参照の値です。次に、 '' dudehp = dudehp-75''は、関連付けられたポインタ内のアドレスの変更を引き起こしますが、シンボルテーブル内の関連付けではありません – eyquem

答えて

3

まず、クラスや何かを書いて、ある時点でこれを整理したいと思うでしょう。関数やメソッド内からグローバル変数を変更することは、通常、悪い考えです。引き算の操作は、あなたが機能でそれをカプセル化する必要がないように簡単です。この場合、当然のことながら

life = 200 

def example(x): 
    return x - 75 

life = example(life) 

:あなたがしようとする場合がありますどのような

はこれです。

0

あなたの関数では、名前dudeHPは関数のローカルです。変更すると、ローカル名だけが変更されます。渡された名前の値には影響しません。

整数を渡すコンテナの要素にすることで、変更することができますコンテナから値を返すことができます。

1

ところで、新人がタイトルで困惑しない限り、質問はPython3固有のものではありません。一般的なPython言語の質問です。

Pythonの変数の範囲と性質を理解する必要があります。変数は特定の値を保持するための名前に過ぎず、内部スコープ変数は外部スコープから変数にアクセスできますが、変数は定義されたブロックのスコープ内にあります。あなたが定義した関数には独自のスコープがあり、それを保守する独自のスタックであり、変数のコピーをその関数に渡しています。

これを処理する最良の方法は、別の答えで指摘されている関数の戻り値です。

実際、グローバルに変数にアクセスしたい場合は、このようにすることができます。

a = 200 

def example(b): 
    global a 
    a = a - 25 

example(a) 
print a 

しかし、これでひんしゅくを買うなく良いスタイル。あなたが使っているトリックもありますが、それは初心者のレベルを超えており、このようになります。 = [200]

def example(a): 
    a[0] = a[0] - 25 

example(a) 
print a[0] 

あなたは簡単にこの方法を採用した場合、あなたの間違いを犯す

しかし、これについては移動するための正しい方法はまだすることができます:

a = 200 

def example(b): 
    return b - 25 

print example(a) 
1

Ned BatcheldersとKristoffのヒントやクラスの使用に関する提案に加えて、これはあなたができる方法です:

class Dude: 
    def __init__(self, hp=200): 
     self.hp = hp 

    def eat(self): 
     self.hp = self.hp + 25 

def example(dude): 
    dude.hp -= 75 

hero = Dude() 
example(hero) 
hero.eat() 
print(hero.hp) # 150 

あなたはexampleは明らかに意味上とに作用するためexampleは、あなたがそれeatようDudeの方法にする必要があり、スタンドアロンの関数であるべき正当な理由がない限り、クラスのオブジェクトにに属しDude

0

dudehpはその機能にローカルスコープを持っているので、その機能の外に人生はありません。したがって、dudehpを使用して人生を更新することは違法です。これは、グローバルキーワードを使用するか、他の人が言及しているように値を保持することで行うことができます。この説明が有用であり、これに対する修正が受け入れられることを願っています。