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

почему эти две операции (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 то же самое. Почему это отличается от + операции?

7 ответов


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

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

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

альтернатива

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

Немного истории

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


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

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

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

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

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

в сторону

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

массивы

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

С array docs:

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


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

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

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


метод, который вы ищете является extend(). От питона документация:

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).

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

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

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


посмотреть документация:

список.добавить(х)

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

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

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

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