Изменение списка в цикле
Я новичок в 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
на ['_']
.