2016-09-28 9 views
2

が、私は今のように、このスクリプトを保護されたループでエラーが発生するのはなぜですか?

for line in file: 
    while line[i] == " ": 
     if i == len(line): 
      break 
     i += 1 
    if i == len(line): 
     pass 
    while not line[i] == " ": 
     if i == len(line): 
      break 
     obj += line[i] 
     i += 1 
    print obj 

を持って、file["clear", "exit"]に等しく、i0に等しいです。

この

Traceback (most recent call last): 
    File "/home/ubuntu/workspace/lib/source.py", line 8, in <module> 
    while not line[i] == " ": 
IndexError: string index out of range 

のような、私はこのスクリプトを実行し、そのエラー私は私のループが右に保護されたかなり確信している、とこの問題が発生する前にそれを破る必要があります。この場合、なぜそれは起こっているのですか?

+0

コードスニペットに 'i'が定義されていません。 [MCVE]を示すコードを更新してください。 –

+2

条件を評価する際に 'i'が範囲外です。 'パス'はおそらくあなたが思っていることをしません。 –

+0

iの値を含めるように編集 – baranskistad

答えて

2

私のループが

ませ保護されていないそうではありません。 whileの条件は、最初にループのボディに到達する前に評価されなければならず、条件は0である。

iは、リストの長さを超えifに条件を移動し、while上で最初の条件がありません確認するには:

while i < len(line) and not line[i] == " ": 
    obj += line[i] 
    i += 1 

そうしないと、ifブロックを移動することができますiの更新後に次の反復の前に条件が評価されるので、while

while not line[i] == " ": 
    obj += line[i] 
    i += 1 
    if i == len(line): 
     break 
+0

'obj'は決して印刷されません、修正しますか? – baranskistad

+0

@bjskistadメインコードにその部分を接続することができます。 –

+0

私はして、それは2つの空白の値を印刷しています。 – baranskistad

1

あなたのループは "安全"ではない、 "ブレーク"はブレークするだけです内部ループので、一度i == len(行)それは最初から出て、メインにとどまり、 [i] = "" "行ではなく、" line "の外側にインデックスを付ける(whileループに入る前に条件がチェックされているので)。

for line in file: 
    while line[i] == " ": 
     if i == len(line): 
      break # THIS executes, thus i == len(line) 
     i += 1 
    if i == len(line): # this is true, thus nothing happens, pass is no-op 
     pass 
    while not line[i] == " ": # this executes, and fails since i == len(line) 
     if i == len(line): 
      break 
     obj += line[i] 
     i += 1 
    print obj 
+0

'パス'は何もしていないということを意味しますか?条件が真であれば動作するはずです。 – baranskistad

+3

"パス"は何もしません。これはPythonでは文字通りノーオペレーションであり、実行には何の意味もありません。多分あなたは "続ける"という意味ですか? – lejlot

関連する問題