2016-07-11 3 views
1

Итерация над изменяемыми объектами являются изменчива во время его исполнения:Могу ли я построить изменяемый диапазон?

a = [11, 12, 13] 

for i in a: 
    if i == 12: 
     a.append(20) 
    print(i) 

Результаты с

11 
12 
13 
20 

И a является [11, 12, 13, 20]

Но если я использую range не изменяемые

a = [11, 12, 13] 

for i in range(len(a)): 
    if i == 1: 
     a.append(20) 
    print(a[i]) 

Результаты с

11 
12 
13 

в то время как a еще [11, 12, 13, 20] впоследствии.

Есть ли способ построить объект myrange, который будет работать так же, как и диапазон, но будет изменяться во время выполнения?

+0

У вас нет генератора в этом коде. Вы уверены, что понимаете, что делает ваш фрагмент кода? – user2357112

+1

Будьте осторожны: первый код может вызвать головную боль, если сравнение и добавление имеют одинаковое значение. Вы не получаете предупреждения, но вы не хотите мутировать список, который вы повторяете когда-либо ... –

+0

@ user2357112, я стараюсь не быть уверенным ни в чем :-). Но в этом случае я думаю, что просто неправильно использовал термин «генератор», который я сейчас исправил и устранил из вопроса. – Aguy

ответ

2

Да, вы можете, и, как вы сами сказали, a уже изменчивый, поэтому вместо того, чтобы итерация в диапазоне, который на основе len(a) перед циклом, вы можете сделать следующее:

for i, val in enumerate(a): 
    if i == 1: 
     a.append(20) 
    print(val) 

Выход:

11 
12 
13 
20 
0

В вашем втором фрагменте кода:

for i in range(len(a)): 
    if i == 1: 
     a.append(20) 
    print(a[i]) 

при использовании range(len(a)) возвращает [0, 1, 2], в этом случае как длина a==3 теперь цикл будет повторяться только 3 раза, как len(a) выполняется в начале цикла, который уже вернул список из трех элементов, а при обновлении списка изменения не отражаются, поскольку len(a) больше не выполняется.

Если вы напечатаете a вне цикла for, вы увидите добавленный элемент (20) в конце списка.

Принимая во внимание, что во втором случае вы пытаетесь выполнить итерацию по списку, которая держит yield результатов, пока весь список не исчерпан.

Смежные вопросы