Python append() vs. + operator в списках, почему они дают разные результаты?

Почему эти две операции (append() и +) дают разные результаты?

>>> c = [1, 2, 3]
>>> c
[1, 2, 3]
>>> c += c
>>> c
[1, 2, 3, 1, 2, 3]
>>> c = [1, 2, 3]
>>> c.append(c)
>>> c
[1, 2, 3, [...]]
>>> 

В последнем случае на самом деле существует бесконечная рекурсия. c[-1] и c совпадают. Почему это отличается от операции +?

Ответ 1

Чтобы объяснить "почему":

Операция + добавляет array элементов исходного массива. Операция array.append вставляет массив (или любой объект) в конец исходного массива, что приводит к ссылке на self в этом месте (следовательно, бесконечная рекурсия).

Разница здесь в том, что операция + действует, когда вы добавляете массив (он перегружен, как и другие, см. в этой главе о последовательностях) конкатенирование элемента. Однако метод append делает буквально то, что вы просите: добавьте объект с правой стороны, который вы ему даете (массив или любой другой объект), вместо того, чтобы принимать его элементы.

Альтернативный

Используйте extend(), если вы хотите использовать функцию, которая действует аналогично оператору + (как показывают другие здесь). Нехорошо делать противоположное: попытаться подражать приложению с помощью оператора + для списков (см. Ссылку ).

Маленькая история

Для развлечения небольшая история: рождение модуля массива в Python в феврале 1993 года. Это может вас удивить, но были добавлены массивы после появления последовательностей и списков.

Ответ 2

append добавляет элемент в список. если вы хотите расширить список с помощью нового списка, вам нужно использовать extend.

>>> c = [1, 2, 3]
>>> c.extend(c)
>>> c
[1, 2, 3, 1, 2, 3]

Ответ 3

Оператор конкатенации + является двоичным инфиксным оператором, который при применении к спискам возвращает новый список, содержащий все элементы каждого из двух операндов. Метод list.append() является mutator на list, который добавляет свой единственный аргумент object (в вашем конкретном примере список c) к теме list. В вашем примере это приводит к c добавлению ссылки на себя (отсюда и бесконечная рекурсия).

Альтернатива конкатенации "+"

Метод list.extend() также является мутаторным методом, который объединяет его аргумент sequence с объектом list. В частности, он добавляет каждый из элементов sequence в порядок итерации.

В стороне

Будучи оператором, + возвращает результат выражения как новое значение. Будучи нецелевым методом mutator, list.extend() изменяет список объектов на месте и ничего не возвращает.

Массивы

Я добавил это из-за потенциальной путаницы, которую может ответить выше ответ Абеля, смешивая обсуждение списков, последовательностей и массивов. Arrays были добавлены в Python после последовательностей и списков как более эффективный способ хранения массивов интегральных типов данных. Не путайте Arrays с помощью lists. Они не одинаковы.

Из массива docs:

Массивы являются типами последовательностей и очень похожи на списки, за исключением того, что тип объектов, хранящихся в них, ограничен. Тип указан во время создания объекта, используя код типа, который является единственным символом.

Ответ 4

Списки Python являются гетерогенными, а элементы в одном списке могут быть любыми типами объектов. Выражение: c.append(c) добавляет объект c к тому, что он может быть в списке. В случае, когда он делает список сам членом списка.

Выражение c += c объединяет два списка и присваивает результат переменной c. Перегруженный оператор + определен в списках для создания нового списка, содержимое которого является элементами в первом списке и элементами во втором списке.

Итак, это действительно просто разные выражения, используемые для создания разных вещей по дизайну.

Ответ 5

Метод, который вы ищете, extend(). Из документации Python :

list.append(x)
    Add an item to the end of the list; equivalent to a[len(a):] = [x].

list.extend(L)
    Extend the list by appending all the items in the given list; equivalent to a[len(a):] = L.

list.insert(i, x)
    Insert an item at a given position. The first argument is the index of the element before which to insert, so a.insert(0, x) inserts at the front of the list, and a.insert(len(a), x) is equivalent to a.append(x).

Ответ 6

вы должны использовать extend()

>>> c=[1,2,3]
>>> c.extend(c)
>>> c
[1, 2, 3, 1, 2, 3]

другая информация: добавить и продлить

Ответ 7

Смотрите документацию:

list.append(х)

  • Добавить элемент в конец списка; эквивалентно [len (a):] = [x].

list.extend(L),  - Расширить список, добавив все элементы в данный список; эквивалентному [len (a):] = L.

c.append(c) "присоединяет" c к себе как к элементу. Поскольку список является ссылочным типом, это создает рекурсивную структуру данных.

c += c эквивалентен extend(c), который добавляет элементы c в c.