2017-04-18 8 views
1

を満たしている場合でも、私のコード内のステートメント条件が

if len(bootstrap_node_list_recieved_no_dups) >= min_node_to_complete_boot_strap: 
    print "recieved required nodes" 

は基本的に私のように、私はこれだけは一度発生する場合、十分なノードを持っているかどうかを知りたい場合は、私はシンプルを持った後、呼び出したステートメントは無視した場合コードは引き続き実行され、繰り返し実行されるので、このif文は毎回期待通りに実行されます。

ifステートメントが実行されるようにコーディングする方法はありますか?しかし、一度完了した後は再び実行されませんか?

入力が定数ではないため、>=が必要です。

説明が少し難しいので、これが明確であることを希望します。

更新、

私は提案を実装しようとしたが、エラーに以下

UnboundLocalError: local variable 'flag' referenced before assignment 

完全なコードになっています:あなたが変更され、いくつかの低迷変数を持つことができ

flag = False 

def number_of_duplicates_in_list(): 
    number_recieved = len(bootstrap_node_list_recieved) 
    bootstrap_node_list_recieved_before = len(bootstrap_node_list_recieved_no_dups) 

    " this method works in O(n^2) time and is thus very slow on large lists" 
    for i in bootstrap_node_list_recieved: 
     if i not in bootstrap_node_list_recieved_no_dups: 
      bootstrap_node_list_recieved_no_dups.append(i) 
    assert len(bootstrap_node_list_recieved_no_dups) >= bootstrap_node_list_recieved_before 
    if len(bootstrap_node_list_recieved_no_dups) >= min_node_to_complete_boot_strap and flag is False: 
     print "recieved required nodes" 
     flag = True 
+3

'hasnt_run_yetとlen(...):hasnt_run_yet = False; ... ...? – deceze

答えて

2

ifステートメントが最初にトリガーされます。以下のコードは、たとえフラグがチェックされていなければ、3を超えるすべての数字がステートメントをトリガーするとしても、 'Triggered'ステートメントを1回だけ出力する最小の例です。

flag = False 

for x in xrange(10): 
    if x > 3 and flag is False: 
     print 'Triggered' 
     flag = True 

    # Do something else 

これを関数内で実行する場合は、フラグの初期化を関数に移す必要があります。関数を再実行すると、フラグをリセットすることに注意してください:

def test_func(): 
    flag = False 
    for x in xrange(10): 
     if x > 3 and flag is False: 
      print 'Triggered' 
      flag = True 

    # Do something else 

test_func() 

は一度フラグを関数を複数回実行するだけif文を誘発し、変更できるようにするには、関数呼び出しにフラグをリンクする必要があります。これを行うための簡単な方法は、各コールにフラグを渡して、返すことです:

ここ
flag = False 

def test_func(flag): 
    for x in xrange(10): 
     if x > 3 and flag is False: 
      print 'Triggered' 
      flag = True 

    # Do something else 
    return flag 

flag = test_func(flag) 
flag = test_func(flag) 

、フラグは、関数の外を定義し、呼び出されたときに各関数に渡されます。トリガされていない場合は、そのまま通過します。トリガされると、変更され、その状態が関数の外に戻されます。

他のアプローチでは、global変数を定義するか、フラグをオブジェクト変数として使用してクラスを構築し、selfでアクセスすることができます。

+0

ありがとう私はこのメソッドを試みたが、UnboundLocalErrorを取得し続ける:割り当ての前にローカル変数 'flag'が参照されている – Rich

+0

Ivは要件に応じて2つのソリューション – Wokpak

0

flagをnumber_of_duplicates_in_list内でグローバルに定義します。さもなければ、あなたはそれを読むことしかできません。