Почему делают эти две операции (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
то же. Почему это отличается с +
операция?
операция +
добавляет элементы массива к исходному массиву. Операция array.append
вставляет массив (или любой объект) в конец исходного массива, в результате чего в этом месте (отсюда и бесконечная рекурсия) появляется ссылка на себя .
Разница заключается в том, что операция + действует специфично при добавлении массива (он перегружен, как и другие, см. настоящую главу о последовательностях) путем конкатенирования элемента. Однако, метод append выполняет буквально то, что вы просите: добавьте объект справа, который вы ему даете (массив или любой другой объект), вместо того, чтобы брать его элементы.
Используйте extension()
если вы хотите использовать функцию, которая действует аналогично оператору + (как другие показали здесь). Противоположное делать неразумно: пытаться имитировать приложение с оператором + для списков (см. мою предыдущую ссылку о том, почему).
Забава, маленькая история: рождение модуля массивов на Python в феврале 1993 года. Это может вас удивить, но массивы были добавлены намного позже появления последовательностей и списков.
.Метод, который Вы ищете, это 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).
См. документация:
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.
Списки питонов неоднородны, т.е. элементы в одном списке могут быть любого типа объектов. Выражение: c.append(c)
добавляет объект c
, каким бы он ни был в списке. В случае, если он делает сам список членом списка.
Выражение c += c
добавляет два списка вместе и присваивает результат переменной c
. Перегруженный оператор +
определяется на списках для создания нового списка, содержимым которого являются элементы первого списка и элементы второго списка.
Так что на самом деле это просто различные выражения, используемые для выполнения различных вещей по дизайну.
следует использовать include()
>>> c=[1,2,3]
>>> c.extend(c)
>>> c
[1, 2, 3, 1, 2, 3]
другую информацию: append vs. extension
append
добавляет элемент в список. если вы хотите расширить список новым списком, вам нужно использовать extend
.
>>> c = [1, 2, 3]
>>> c.extend(c)
>>> c
[1, 2, 3, 1, 2, 3]