Почему эти две операции ( 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
такие же. Чем отличается +
операция?
python
list
append
nested-lists
ooboo
источник
источник
+=
: stackoverflow.com/questions/725782/…Ответы:
Чтобы объяснить «почему»:
+
Операция добавляет массив элементов в исходном массиве.array.append
Операция вставляет массив (или любой объект) в конец исходного массива, который приводит к ссылке на себя в этом месте (отсюда и бесконечная рекурсия).Разница здесь в том, что операция + действует определенным образом, когда вы добавляете массив (он перегружен, как и другие, см. Эту главу о последовательностях), объединяя элемент. Однако метод append делает буквально то, о чем вы просите: добавляет объект с правой стороны, который вы ему даете (массив или любой другой объект), вместо того, чтобы брать его элементы.
Альтернатива
Используйте,
extend()
если вы хотите использовать функцию, которая действует аналогично оператору + (как здесь также показано другими). Было бы неразумно делать обратное: пытаться имитировать добавление с помощью оператора + для списков (см. Мою предыдущую ссылку о том, почему).Маленькая история
Ради интереса, немного истории: рождение модуля массива в Python в феврале 1993 года. Это может вас удивить, но массивы были добавлены намного позже, чем появились последовательности и списки.
источник
+
симметричности: объединить список со списком.Оператор конкатенации
+
- это бинарный инфиксный оператор, который при применении к спискам возвращает новый список, содержащий все элементы каждого из двух его операндов.list.append()
Метод являетсяmutator
наlist
который присоединяет свой единственныйobject
аргумент (в вашем конкретном примере спискаc
) к предметуlist
. В вашем примере это приводит кc
добавлению ссылки на себя (отсюда и бесконечная рекурсия).Альтернатива конкатенации '+'
Этот
list.extend()
метод также является методом мутатора, который объединяет свойsequence
аргумент с субъектомlist
. В частности, он добавляет каждый из элементовsequence
в порядке итерации.В сторону
Являясь оператором,
+
возвращает результат выражения в виде нового значения. Поскольку этоmutator
метод без цепочки , онlist.extend()
изменяет список тем на месте и ничего не возвращает.Массивы
Я добавил это из-за потенциальной путаницы, которую может вызвать приведенный выше ответ Абеля, смешав обсуждение списков, последовательностей и массивов.
Arrays
были добавлены в Python после последовательностей и списков, как более эффективный способ хранения массивов целых типов данных. Не путайтеarrays
сlists
. Они не одинаковы.Из документов массива :
Массивы являются последовательными типами и ведут себя очень похоже на списки, за исключением того, что тип хранимых в них объектов ограничен. Тип указывается во время создания объекта с помощью кода типа, который представляет собой один символ.
источник
append
добавляет элемент в список. если вы хотите расширить список новым списком, который вам нужно использоватьextend
.источник
+
иextend
дать другие результаты, нам было бы о чем подумать.append
и+
разные. Поэтому. Мне нравится этот ответ, потому что он предлагает больше смысла в том, что делать.__lt__
его нельзя перегрузить в Python (в настоящее время это возможно). Вопросы «Почему» - самые важные, но зачастую на них сложнее всего ответить: они задают суть, а не указатель на руководство. И, конечно же: если вам не нравится вопрос (а мне не нравится больше всего), то не отвечайте ;-)c += [c]
иc.append(c[:])
тоже.a+b != a*b
? Это разные операции. Это ответ. «Почему» не так полезен, как другие вопросы, например «Как правильно добавить?» Или «Что не так с этим дополнением, которое ведет к бесконечной рекурсии?» Вопросы формы «Что мне делать с X» или «Что пошло не так, когда я сделал X»? Или «Что мне делать вместо X» тоже поможет кому-то учиться, но даст целенаправленные, полезные и действенные ответы.Списки Python неоднородны, поэтому элементы в одном списке могут быть объектами любого типа. Выражение:
c.append(c)
добавляет объект,c
каким бы он ни был, в список. В этом случае он сам делает список членом списка.Выражение
c += c
складывает два списка и присваивает результат переменнойc
. Перегруженный+
оператор определяется в списках для создания нового списка, содержимым которого являются элементы в первом списке и элементы во втором списке.Так что на самом деле это просто разные выражения, которые изначально используются для обозначения разных вещей.
источник
Метод, который вы ищете
extend()
. Из документации Python :источник
вы должны использовать extend ()
Другая информация: добавить против расширения
источник
См. Документацию :
c.append(c)
"добавляет" c к себе как элемент . Поскольку список является ссылочным типом, это создает рекурсивную структуру данных.c += c
эквивалентноextend(c)
, которое добавляет элементы c к c.источник