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 81

7 ответов:

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

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

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

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

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

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

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

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

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

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

списки 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 к гр.