Потрібно, щоб це працювало таким чином, якщо ви задумаєтесь. Вираз послідовності 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]друкувати?