Список значений замены не работает должным образом - PullRequest
0 голосов
/ 12 октября 2019

Для кода ниже

L = [1, 2, 3, 4, 5]
for i in L:
    L[i] = 2
print(L)

Я ожидал, что результат будет [1, 2, 2, 2, 2]

Но получил [1, 2, 2, 4, 2], почему?

Ответы [ 3 ]

1 голос
/ 12 октября 2019

Значения вашего списка (L) меняются , пока вы зацикливаетесь, поэтому у вас нет доступа к значениям 1, 2, 3 и т. Д., Нодовольно разные значения.

Если разбить каждую итерацию, она может стать более понятной

Первая итерация: i = 1 (первое значение в L), L, индекс обновлений 1 должно быть 2 (поэтому без изменений):

L = [1, <strong>2</strong>, 3, 4, 5]

Вторая итерация: i = 2 (второе значение в L), L обновляет индекс 2 до 2:

L = [1, 2, <strong>2</strong>, 4, 5]

Третья итерация: i = 2 (теперь третье значение в L), L обновляет индекс 2 до 2 (поэтому без изменений):

L = [1, 2, <strong>2</strong>, 4, 5]

Четвертыйитерация: i = 4 (четвертое значение в L), L обновляет индекс 4 до 2:

L = [1, 2, 2, 4, <strong>2</strong>]

Fith / Last Iteration:

i = 4(новое значение fith в L), L обновляет индекс 4 до 2 (поэтому никаких изменений):

L = [1, 2, 2, 4, <strong>2</strong>]

Таким образом, ваш результирующий список выглядит следующим образом:

[1, 2, 2, 4, 2]
1 голос
/ 12 октября 2019

Вы не должны делать L[i] после for i in L. Почему?

  • i представляет элемент в этом списке, а не индекс этого списка.

В вашем цикле вы используете каждый элемент в качестве индекса для Lзаменить их значение на 2.

Почему 4 находится в [1, 2, 2, 4, 2]?

  • Индекс элемента 4 равен 3.

Доказательство

>>> L = [1, 2, 3, 4, 5]
>>> for i in L:
...     print(id(i))
...
4436993456
4436993488
4436993520
4436993552
4436993584
>>> for i in L:
...     L[i] = 2
...
>>> for i in L:
...     print(id(i))
...
4436993456
4436993488
4436993488
4436993552
4436993488
>>>
  • id для поиска Return the identity of an object
  • Вы также можете увидеть 4436993488 найден несколько раз в этомвторой списокЭто шоу, где ваша замена сделана.
  • Эти 3 в списке заменены на 2, только у этого 4 был шанс получить замену. Так что L[4] никогда не происходило !!
0 голосов
/ 12 октября 2019
for i in L:

Это перебирает значения в списке;т.е. 1, 2, 3 и т. д.

Но вы используете эти значения в качестве индексов в списке. Таким образом, результат не то, что вы ожидаете. Вы в основном делаете:

L[1] = 2
L[2] = 2
...

Вы, вероятно, хотите:

for i in range(len(L)):
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...