2016-04-09 4 views
0

のインサートを()リストの無限の上にループを使用したとき1から始まる常時昇順の数字列で、newlinesは「なし」と表示されます。なぜ誰がこのことが分かっているのですか? newlinesとのアイデアは、それがsplit_2がそれを置き換える、lineと同じ位置(index)に挿入された状態で、リストlinesの改変された形態であるということであるところでは、なぜ私はすでに.txtファイル内に含まれている<code>crop</code>に値を入力することによって、機能<code>appendA</code>を実行すると、<code>index</code>と<code>newlines</code>として<code>index</code>で無限に印刷されている

crop = input("Which crop? ") 
quantity = input("How many? ") 
newlines = [] 
newlines = list(newlines) 

def appendA(): 

file_initial = open('cropdatabase.txt', 'r') 
lines = file_initial.readlines() 

for line in lines: 
    if crop in line: 
     index = lines.index(line) 
     print (index) 
     line = str(line) 
     split_2 = line.split (' ') 
     split_2.append (quantity + ' ') 
     split_2 = str(split_2) 

     # everything works up to here. 

     newlines = lines.insert (index, split_2) 
     print (newlines) 

file.close() 

def appendB(): 

file = open('cropdatabase.txt', 'a+') 
file.write ('\n') 
file.write (crop + ' ') 
file.write (quantity + ' ') 


with open('cropdatabase.txt', 'a+') as file: 
if crop in open('cropdatabase.txt').read(): 
    appendA() 
else: 
    appendB() 
file.close() 
+0

繰り返し処理しているものと同じiterableにアイテムを追加し続けます。そのプロセスがどのように終了すると思いますか? – Reti43

+0

しかし、必ずしも 'crop'が入っている行だけに影響を与えるべきですか? – superato

+0

私は何を追加しますか? – superato

答えて

1

あなたの誤解はおそらくinsert()と繰り返し処理が原因です。

3つのアイテムのリストがあるとします。 for item in my_listを実行すると、Pythonはそこにあるアイテムの数を調べず、その多くのインデックスを繰り返します。リストが使い尽くされるまで反復を続けます。アイテムをインデックスに挿入すると、リスト内の他のすべてのアイテムが1つ前のインデックスにプッシュされます。したがって、現在のループ内のインデックスiにあるものは、次のもののためにi+1になります。もう一度実行します。ここに簡単なデモがあります。

>>> a = [1, 2, 3] 
>>> for index, item in enumerate(a): 
...  print(item) 
...  a.insert(index, '{0}{0}'.format(index)) 
...  print(a) 

0 
['00', 0, 1, 2] 
0 
['00', '11', 0, 1, 2] 
0 
['00', '11', '22', 0, 1, 2] 
0 
['00', '11', '22', '33', 0, 1, 2] 
0 
['00', '11', '22', '33', '44', 0, 1, 2] 
0 
['00', '11', '22', '33', '44', '55', 0, 1, 2] 
... 

新しい要素を挿入するのではなく、インデックスiでリストを変更したのですか?たとえば、lines[index] = split_2です。

insert()についてのその他のものはit modifies the list in-place and returns None as its valueです。これはnewlinesが指している理由とそれがなぜNoneであるのかです。そのような機能の他の例は、list.append(),list.sort()およびrandom.shuffle()である。

関連する問題

 関連する問題