У меня есть код:

x = 6

for y in range(x):
    print(y)
    x -= 2

Это дает: 0, 1, 2, 3, 4, 5

Я ошибочно предположил, что это даст один из этих двух результатов:

  1. 0, 0, 0 Поскольку x изменяется от 6 до 4 до 2 до 0, будет напечатано только 3 y. Кроме того, насколько я понимаю, после каждого цикла он возвращается к оператору цикла for, таким образом, полностью сбрасывает range (), и теперь каждый y равен 0. Я запустил код на PythonTutor, и указатель, похоже, тоже пошел вернуться к оператору цикла после каждого цикла.

  2. 0, 1, 2 Поскольку x изменяется от 6 до 4 до 2 до 0, будет напечатано только 3 y. Я подумал, что возможно, что, хотя y принимает значение исходного диапазона (т.е. 6), оно будет ограничиваться каждым новым x и, таким образом, будет напечатано только 3 y.

Вариант 1 был для меня наиболее интуитивным (хотя и неправильным), и я не уверен, как понять, почему ответ такой.

0
Noob 9 Окт 2021 в 21:16

3 ответа

Лучший ответ

Экземпляр range, созданный range(x), использует значение x во время вызова range. Он не выполняет повторную проверку значения x каждый раз, когда вам нужно новое значение из диапазона. Ваш код фактически такой же, как

x = 6

for y in [0, 1, 2, 3, 4, 5]:
   print(y)
   x -= 2

Ничего из того, что вы делаете с x, никак не влияет на повторяемый объект range.

4
chepner 9 Окт 2021 в 18:21

Вызов range() создает объект range из x в начале цикла. Изменение x после этого не влияет на объект range, который используется для итерации.

Если вы хотите иметь возможность изменять количество итераций, которые вы делаете в цикле, вы, вероятно, захотите использовать while.

1
Da Chucky 9 Окт 2021 в 18:22

Попробуй это:

# Firstly you assign 6 to the variable x
x = 6 

# 'y' will now be assigned to the numbers [0, 1, 2, 3, 4, 5, 6] because the range is 'x' which is 6.

# by printing 'x' it will execute [0, 1, 2, 3, 4, 5, 6] but since x is 'x -2' which is the same as  '6 - 2'  it will print out the number 6 and -2 until it gets to the range which is -6. the output will be 6 numbers [6, 4, 2, 0, -2, -4] 


for y in range(x):
    print(x)
    x = x - 2

# i am showing you a way of making it give you your expected output [6, 4, 2, 0, -2, -4] 
-1
Thato Freddy 9 Окт 2021 в 18:38