2017-01-16 2 views
2

Если я построить вложенный список:Почему `a + = x` и` a = a + x` реализованы по-разному для вложенного списка?

nested_list = 3*[[]] 

и если я затем добавить элементы к нему

  1. nested_list[1] += [1, 2, 3]. возвращает: [[1, 2, 3], [1, 2, 3], [1, 2, 3]]
  2. nested_list[1] = nested_list[1] + [1, 2, 3]. возвращает: [[], [1, 2, 3], []]

Я ожидал получить результат для случая 2 для обеих операций.

Почему я получаю другой результат в случае 1? Является ли это выбором дизайна для python? Какова логика результата в случае 1?

+4

Основная проблема заключается в том, что 'nested_list = 3 * [[]]' - плохой способ создать список списков: http://stackoverflow.com/q/240178/3001761 – jonrsharpe

ответ

4

В первом примере вы обновление ссылка nested_list[1]. Поскольку все 3 слота используют одну и ту же ссылку, вы видите свое изменение 3 раза.

Во втором примере вы не добавляете место на месте: вы создаете другую ссылку для nested_list[1], которая обновляет только средний слот списка списков, оставляя остальных со старой ссылкой.

Обратите внимание, что nested_list = 3*[[]] для создания вложенного списка не очень полезно. Вы можете создать отдельные ссылки для всех подсписков, как это:

nested_list = [[] for _ in range(3)] 

В настоящее время обе операции дают одинаковый результат (но предпочтительный способ nested_list[1] += ..., так как это путь более производительный)

Это не относится до неизменяемых объектов, таких как строки, ints, floats, где оператор * не представляет проблемы. Применение дополнения на месте только изменяет элемент, к которому он относится.

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