Изменение списка в цикле

Я новичок в Python, но я понимаю, что это не должно быть сделано таким образом, поэтому рассмотрите следующие фрагменты кода как чисто образовательные: -)

В настоящее время я читаю "Learning Python" и пытаюсь полностью понять следующий пример:

>>> L = [1, 2, 3, 4, 5]
>>> for x in L:
...    x += 1
...
>>> L
[1, 2, 3, 4, 5]

Я не понял, было ли это поведение несколько связано с неизменностью числовых типов, поэтому я выполнил следующий тест:

>>> L = [[1], [2], [3], [4], [5]]
>>> for x in L:
...    x += ['_']
...
>>> L
[[1, '_'], [2, '_'], [3, '_'], [4, '_'], [5, '_']]

Вопрос: что делает список неизменным в первом коде и изменено во втором?

Моя интуиция заключается в том, что синтаксис вводит в заблуждение и что:

  • x += 1 для целых чисел действительно означает x = x + 1 (таким образом, присваивая новую ссылку)
  • x += ['_'] для списка действительно означает x.extend('_') (тем самым меняя список на месте)

Ответ 1

Вопрос: что делает список неизменным в первом коде и изменен во втором?

В первом коде список представляет собой последовательность (неизменяемых) целых чисел. Цикл устанавливает x для обращения к каждому элементу последовательности по очереди. x += 1 изменяет x, чтобы ссылаться на другое целое число, которое больше, чем значение x, ранее упомянутое. Элемент в исходном списке не изменяется.

Во втором коде список, если последовательность (изменяемых) списков. Цикл устанавливает x для обращения к каждому элементу последовательности по очереди. x += ['_'] как x относится к списку, это расширяет список, на который ссылается x на ['_'].