Потрібно, щоб це працювало таким чином, якщо ви задумаєтесь. Вираз послідовності for
циклу може бути будь-яким:
binaryfile = open("file", "rb")
for byte in binaryfile.read(5):
...
Ми не можемо запитувати послідовність при кожному проходженні через цикл, інакше ми в кінцевому підсумку вдруге прочитаємо з наступної партії по 5 байт. Природно, що Python повинен певним чином зберігати результат виразу приватно перед початком циклу.
Вони в різних сферах?
Ні. Для підтвердження цього ви можете залишити посилання на оригінальний словник області ( local () ) і помітити, що ви фактично використовуєте однакові змінні всередині циклу:
x = [1,2,3,4,5]
loc = locals()
for x in x:
print locals() is loc
print loc["x"]
break
Що відбувається під капотом, що дозволяє щось подібне працювати?
Шон Вієйра точно показав, що відбувається під капотом, але щоб описати це в більш читабельному коді пітона, ваш 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]
друкувати?