Как это заявление будет работать?
j for i in range(5)
Пример:
x1=(j for i in range(5))
даст пять 4 при повторении. Почему это не даст 01234, например, когда мы заменим j на i.
Как работает это утверждение?
a = [0, 1, 2, 3]
for a[-1] in a:
print(a[-1])
0
1
2
2
Если вы получаете четыре 4 из первого примера, это просто означает, что j
был ранее определен в вашем коде, и его значение оказалось равным 4.
Ваш первый пример представляет собой выражение генератора (круглые скобки обязательны, поэтому первая версия, которую вы показываете, на самом деле не имеет смысла). Выражение генератора неоднократно возвращает j
, который не определен в коде, который вы показываете. Но, судя по вашему описанию, оно уже имеет значение 4
в среде, в которой вы тестировали, поэтому вы неоднократно видите это значение. Вы никогда не используете значение i
, которое получает значения из range
.
Что касается вашего другого цикла, for a[-1] in a
продолжает перепривязывать последнее значение в списке, а затем печатать его.
Цикл for выполняет назначение цели, которую вы ему даете, между for
и in
. Обычно вы используете имя локальной переменной (например, i
или j
), но вы можете использовать более сложную цель присваивания, например self.index
или, как в этом случае, a[-1]
. Очень странно переписывать значение вашего списка, когда вы перебираете его, но это не запрещено.
Вы никогда не распечатаете 3
, потому что каждое из предыдущих заданий по мере повторения перезаписывало его в списке. Последняя итерация не изменяет печатаемое значение, так как вы присваиваете a[-1]
самому себе.
Ваш первый вопрос вызывает ошибку при повторении, так как j
не определен. Если вы получаете какой-либо ответ от этого, вы, вероятно, определили значение для j
над вашим генератором, которое звучит как 4
в вашем коде.
По поводу вашего второго вопроса:
когда у вас есть что-то вроде этого:
for i in a:
...
На самом деле вы делаете это в каждом цикле: i=a[0], i=a[1], ...
.
Когда вы пишете a[-1] in a
, это примерно равно: a[-1]=a[0], a[-1]=a[1], ...
и вы каждый раз меняете последний элемент a
. Итак, в конце последним элементом вашего списка будет 2
.
Да, это правильно. Я вижу, что использовал j ранее, и теперь это имеет смысл. Спасибо
j for i in range(5)
вызовет исключение, поскольку j не определено, и все, что делает ваш цикл for, — это изменение последнего значенияa
на текущее значение, которое повторяется циклом for, а затем печатает это значение.