dar*_*dog 2 python if-statement while-loop
我有一个小文件读取例程,我只想要我有它的前200条记录,但是我一直无法弄清楚使用"while"构造有什么问题.此代码有效:
import csv, sys, zipfile
sys.argv[0] = "/home/tom/Documents/REdata/AllListing1RES.zip"
zip_file = zipfile.ZipFile(sys.argv[0])
items_file = zip_file.open('AllListing1RES.txt', 'rU')
rows = []
for row_index, row in enumerate(csv.DictReader(items_file, dialect='excel', delimiter='\t')):
if (row_index < 200):
rows.append(row)
else : break
Run Code Online (Sandbox Code Playgroud)
这段代码一直运行,直到它失败并出现内存不足的情况我认为它是等效的?
import csv, sys, zipfile
sys.argv[0] = "/home/tom/Documents/REdata/AllListing1RES.zip"
zip_file = zipfile.ZipFile(sys.argv[0])
items_file = zip_file.open('AllListing1RES.txt', 'rU')
rows = []
for row_index, row in enumerate(csv.DictReader(items_file, dialect='excel', delimiter='\t')):
while (row_index < 200):
rows.append(row)
else : break
Run Code Online (Sandbox Code Playgroud)
那么什么是正确的构造使用时? -
它们不是等价的,因为在你的while循环中,它具有的条件row_index < 200,永远不会是假的,因为row_index当你在循环中时永远不会改变.
这就是为什么你得到一个条件的内存,因为你可能遇到了无限循环.
你基本上是这样说的:
Psuedo代码:
stay in block one as long as row_index < 200:
block_one:
rows.append(row)
goto block_one
Run Code Online (Sandbox Code Playgroud)
你可以看到row_index永远不会改变,因此你将永远在block_one中.
而if语句具有以下伪代码:
if row_index < 200 goto block_one otherwise break:
block_one:
rows.append(row)
Run Code Online (Sandbox Code Playgroud)
你可以看到它block_one不会回归自身,就像你在while循环中看到的那样.