생각해 보면 이런 식으로 작동하는 것이 필요합니다. for
루프 시퀀스에 대한 표현식은 다음과 같을 수 있습니다.
binaryfile = open("file", "rb")
for byte in binaryfile.read(5):
...
루프를 통과 할 때마다 시퀀스를 쿼리 할 수 없거나 여기서는 다음 5 바이트 배치에서 두 번째로 읽습니다 . 당연히 파이썬은 루프가 시작되기 전에 어떤 식 으로든 표현식의 결과를 비공개로 저장해야합니다.
다른 범위에 있습니까?
아니오.이를 확인하기 위해 원래 범위 사전 ( locals () )에 대한 참조를 유지하고 실제로 루프 내에서 동일한 변수를 사용하고 있음을 알 수 있습니다.
x = [1,2,3,4,5]
loc = locals()
for x in x:
print locals() is loc
print loc["x"]
break
이와 같은 작업을 가능하게하는 내부에서 무슨 일이 일어나고 있습니까?
Sean Vieira 는 내부에서 무슨 일이 일어나고 있는지 정확히 보여 주었지만 더 읽기 쉬운 파이썬 코드로 설명하기 위해 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];
...
}
이 접근 방식은 항목 변수와 시퀀스 변수가 동일한 경우 실패 합니다. 첫 번째 항목에 처음으로 다시 할당 된 x
후 시퀀스 가 더 이상 다음 인덱스를 조회하는 데 사용할 수 없기 때문 x
입니다.
그러나 전자의 접근 방식을 사용하면 첫 번째 줄 ( it = iter(x)
) 은 그때부터 다음 항목을 제공 할 실제로 책임이 있는 반복기 객체 를 요청합니다 . x
원래 가리키는 시퀀스는 더 이상 직접 액세스 할 필요가 없습니다.
for i in printAndReturn [1,2,3,4,5] …
몇 번[1,2,3,4,5]
인쇄 해야 합니까?