如果您考虑一下,则必须以这种方式工作。for
循环序列的表达式可以是任何东西:
binaryfile = open("file", "rb")
for byte in binaryfile.read(5):
...
我们无法在循环的每次遍历中查询序列,否则在这里我们将第二次从下一批5字节中读取数据。自然,Python必须以某种方式在循环开始之前私下存储表达式的结果。
它们在不同的范围内吗?
不能。要确认这一点,您可以保留对原始范围字典的引用(locals()),并注意实际上您在循环内使用的是相同的变量:
x = [1,2,3,4,5]
loc = locals()
for x in x:
print locals() is loc
print loc["x"]
break
使这种事情起作用的幕后情况是什么?
肖恩·维埃拉(Sean Vieira)确切地显示了幕后的情况,但是为了用更具可读性的python代码来描述它,您的for
循环本质上等效于以下while
循环:
it = iter(x)
while True:
try:
x = it.next()
except StopIteration:
break
print x
这与您在较旧版本的Java中看到的传统索引编制迭代方法不同,例如:
for (int index = 0; index < x.length; index++) {
x = x[index];
...
}
当item变量和sequence变量相同时,此方法将失败,因为x
在第一次将x
其重新分配给第一个项目之后,该序列将不再可用于查找下一个索引。
但是,采用前一种方法时,第一行(it = iter(x)
)请求一个迭代器对象,该对象实际上是从那时起负责提供下一个项目的对象。x
最初指向的序列不再需要直接访问。
for i in printAndReturn [1,2,3,4,5] …
,应该[1,2,3,4,5]
打印多少次?