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

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

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

100
задан Micha Wiedenmann 15 June 2015 в 07:56
поделиться

6 ответов

Для объяснения "почему":

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

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

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

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

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

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

.
130
ответ дан 24 November 2019 в 04:52
поделиться

Метод, который Вы ищете, это extension(). Из документации Python /tmp:

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
ответ дан 24 November 2019 в 04:52
поделиться

См. документация:

list.append(x)

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

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

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

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

.
2
ответ дан 24 November 2019 в 04:52
поделиться

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

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

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

8
ответ дан 24 November 2019 в 04:52
поделиться

следует использовать include()

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

другую информацию: append vs. extension

2
ответ дан 24 November 2019 в 04:52
поделиться

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

>>> c = [1, 2, 3]
>>> c.extend(c)
>>> c
[1, 2, 3, 1, 2, 3]
15
ответ дан 24 November 2019 в 04:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: