2012-02-28 7 views
1

'while'ループが実行されるかどうかを1つの変数(終了)それは別の関数内で最初の関数でwhileループは、私がやろうとしています何のほんの一例です1つの関数で変数を定義し、それを認識する最初の関数で別の変数を変更する方法

while exit == 0: 
     option = (raw_input("What would you like to do? ")) 
     if option == exit: 
      exit() 
    def exit(): 
     exit = 1 

を停止するように。

私はそれを実行しようとするとwhileループを残さず、そうすることでプログラムが終了しません。 whileループがexitが1になってループを終了することを認識できるようにするにはどうすればよいですか? 申し訳ありませんが、これは私の初めてstackoverflowを使用して質問するので、非常に良いではない場合。

追加:私はプログラムの一部でこれを行うため、関数間で変数を変更する方法を知りたいと思います。私はちょうどあなたのexitコールの代わりにbreakを使用し、離れてあなたのexit機能を投げる異なる機能

+0

モジュールスコープで定義されたモジュール変数を使用し、異なる機能で使用することができます(質問に答えてください)。ループを終了する方法は異なっています。もし 'option ==" exit ":exit = 1'がそのトリックを終えたならば。 – mitch

答えて

3

ここでの問題はスコープです。exitは、exit()のローカルなので、ループスコープの変数exitには影響しません。

より良い解決策はこれです:

exit = False 
while not exit: 
    option = raw_input("What would you like to do?") 
    if option == "exit": 
     exit = True 

それとも単に:

while True: 
    option = raw_input("What would you like to do?") 
    if option == "exit": 
     break 

1オーバーTrueFalseの使用をして0 - あなたがここに意味があるとして、これは、より多くのニシキヘビです真理値ではなく、整数である。文字列"exit"と比較するように変更しました。これは、ユーザ入力をexitの値と比較しないで、私が望んだものと推定したためです。

問題が同じスコープになりたい場合は、クラスのコード部分を作成することができます。ここ

class Doer: #Naturally, give it a real name based on it's purpose. 
    def __init__(self): 
     self.exit = False 
     while not self.exit: 
      option = raw_input("What would you like to do?") 
      if option == "exit": 
       self.exit() 

    def exit(self): 
     self.exit = True 

exitは、インスタンス変数である(したがってselfからアクセスされている)、したがって、両方の時間我々は、同じ変数を参照しています。

コードが複雑な問題の単純化ではない場合は、最初の解決策の1つがより適切であるため、これは主に過度のものです。

1

で「終了」を持っている理由ですので、また、私が終了する前にデータを保存するつもりです。

1

最初にあなたの変数と関数が同じ名前を持っていますが、ここではあなたのために働くかもしれない何かであるべきではありません。

status = True 
while status: 
    option = (raw_input("What would you like to do? ")) 
    if option == "exit": 
     break 
    elif option == "do_something": 
     status = do_something() 
    elif option == "do_something_and_exit": 
     status = do_something_and_exit() 
    else: 
     print "I don't understand" 

def do_something(): 
    #do something awesome 
    return True 
def do_something(): 
    #do someting awesome 
    return False 
+0

okありがとうございました – udpatil

1

このような変数は、いくつかのオブジェクトの状態のように見えます。このオブジェクトは、機能としての役割を果たすようにするには、あなたはそれ呼び出し可能

class Ask(object): 
    def __call__(self): 
     self.exit = False 
     while not self.exit: 
      option = (raw_input("What would you like to do? ")) 
      if option == 'exit': 
       break 
    def quit(): 
     self.exit = True 

ask = Ask() 

>>> ask() 
1

別の関数から変数を変更する簡単な方法は、返り値にあることを確認して、それをローカルに割り当てることができます。

while exit == 0: 
    option = (raw_input("What would you like to do? ")) 
    if option == 'exit': 
     exit = set_exit() 

def set_exit(): 
    return 1 
0

私は回答者に少し遅れてるようだが、ここでは閉鎖し、それを行うには、突然変異(と古代のプログラミングトリック)を使用する方法は次のとおりです。あなたのコード例では、このようになります。

これはPython3でも機能します(python2では同じことができますが、変数を保持するためにはリストを使用する必要があります)。

x = 1 

def mutateX(new): 
    nonlocal x  # you will have to use the 'global' keyword if this function is defined in the body of a module 
    x = new 

print(x) # --> 1 
mutateX(2) 
print(x) # --> 2 

これは、あなたがこのケースでやるべきものではありません(ただbreakを使用)、それはあなたがあなたの質問のタイトルに尋ねた質問に答えます。

関連する問題