В чем разница extendи просто использование оператора сложения - в приведенном выше примере x = x + [4, 5]?
Рохан
303
На самом деле есть большая разница - x + [4, 5]дает вам новый список, назначенный х - x.extend()мутирует оригинальный список. Я уточню в своем ответе здесь ниже.
Аарон Холл
@AaronHall @Rohan, но это то же самое, что и x += [4,5].
Аститва Шривастава
1
@AstitvaSrivastava На самом деле, я думаю, что расширение быстрее с точки зрения байт-кода
MilkyWay90
1
Ключевое слово при использовании append- Object . Если вы попытаетесь использовать extendи передадите словарь , он добавит ключ , а не весь хеш в конец массива.
Энтони
640
appendдобавляет элемент в список и extendобъединяет первый список с другим списком (или другим итеративным, не обязательно списком).
В чем разница между методами list, добавляющими и расширяющими?
appendдобавляет свой аргумент как отдельный элемент в конец списка. Длина самого списка увеличится на единицу.
extendперебирает свой аргумент, добавляя каждый элемент в список, расширяя список. Длина списка будет увеличиваться, сколько бы элементов ни было в итерируемом аргументе.
append
list.appendМетод добавляет объект в конец списка.
my_list.append(object)
Каким бы ни был объект, будь то число, строка, другой список или что-то еще, он добавляется в конец my_listкак отдельная запись в списке.
Так что имейте в виду, что список - это объект. Если вы добавите другой список в список, первый список будет одним объектом в конце списка (что может не соответствовать вашему желанию):
>>> another_list =[1,2,3]>>> my_list.append(another_list)>>> my_list['foo','bar','baz',[1,2,3]]#^^^^^^^^^--- single item at the end of the list.
extend
list.extendМетод расширяет список путем добавления элементов из итератора:
my_list.extend(iterable)
Таким образом, при расширении каждый элемент повторяемого элемента добавляется в список. Например:
Имейте в виду, что строка является итеративной, поэтому, если вы расширяете список строкой, вы добавляете каждый символ во время итерации по строке (что может не соответствовать вашему желанию):
Оба +и +=операторы определены для list. Они семантически похожи на расширение.
my_list + another_list создает третий список в памяти, так что вы можете вернуть его результат, но для этого требуется, чтобы второй итерируемый был список.
my_list += another_listмодифицирует список на месте (он является оператором на месте, и списки изменяемые объекты, как мы уже видели) , поэтому он не создает новый список. Это также работает как расширение, так как вторая итерация может быть любой итерацией.
Не запутайтесь - my_list = my_list + another_listэто не эквивалентно +=- это дает вам новый список, назначенный my_list.
Итерация по многочисленным вызовам appendдобавляет сложность, делая ее эквивалентной расширению, и поскольку итерация расширения реализована в C, она всегда будет быстрее, если вы намереваетесь добавлять последовательные элементы из итерируемого в список.
Представление
Вы можете задаться вопросом, что является более производительным, поскольку append можно использовать для достижения того же результата, что и extension. Следующие функции делают то же самое:
def append(alist, iterable):for item in iterable:
alist.append(item)def extend(alist, iterable):
alist.extend(iterable)
Идеальный ответ, я просто не могу сравнить время добавления только одного элемента
Делайте семантически правильную вещь. Если вы хотите добавить все элементы в итерацию, используйте extend. Если вы просто добавляете один элемент, используйте append.
Итак, давайте создадим эксперимент, чтобы увидеть, как это работает во времени:
def append_one(a_list, element):
a_list.append(element)def extend_one(a_list, element):"""creating a new list is semantically the most direct
way to create an iterable to give to extend"""
a_list.extend([element])import timeit
И мы видим, что выход из нашего пути создания итерируемого простого использования расширения - это (незначительная) трата времени:
Из этого мы узнаем, что нет ничего полезного, extendкогда у нас есть только один элемент для добавления.
Кроме того, эти сроки не так важны. Я просто показываю им, чтобы подчеркнуть, что в Python делать семантически правильные вещи - значит делать все правильно .
Вполне возможно, что вы можете протестировать время для двух сопоставимых операций и получить неоднозначный или обратный результат. Просто сосредоточьтесь на том, чтобы делать семантически правильную вещь.
Вывод
Мы видим , что extendсемантический яснее, и что он может работать намного быстрее , чем append, если вы собираетесь добавить каждый элемент итератора в список.
Если у вас есть только один элемент (не в итерируемом) для добавления в список, используйте append.
@ Аарон Холл Один небольшой комментарий в алгоритме синхронизации. «extend_one» может возвращать «немного неправильное» время, потому что создание списка также вовлечено. Вероятно, лучше создать элементы как переменные ( ex1 = 0и ex2 = [0]) и передать эти переменные, если вы хотите быть более строгими.
Ильяс Илиадис
19
Идеальный ответ действительно. А как насчет производительности l1 += l2против l1.extend(l2)?
Жан-Франсуа Т.
6
@ Жан-Франсуа Т .: l1 += l2и в l1.extend(l2)конечном итоге выполнить тот же код ( list_extendфункция в listobject.c). Единственными отличиями являются: 1. +=переназначение l1(само по себе для lists, но переназначение поддерживает неизменяемые типы, которые не совпадают с объектом после), что делает его недопустимым, если l1на самом деле является атрибутом неизменяемого объекта; например, t = ([],), t[0] += lstпотерпит неудачу, в то время как t[0].extend(lst)будет работать. 2. l1 += l2использует выделенные байт-коды, а l1.extend(l2)использует обобщенный метод диспетчеризации; это делает +=быстрее чем extend.
ShadowRanger
3
Тот факт, что +=необходимо переназначить l1, означает, что в некоторых случаях более медленная отправка extendчастично или полностью компенсируется отсутствием повторного присвоения левой стороне. Например, если listатрибут является атрибутом объекта self.l1 += l2и self.l1.extend(l2)имеет одинаковую производительность в моей установке Python 3.6, просто потому, что реальная операция больше похожа self.l1 = self.l1.__iadd__(l2), что означает, что она должна выполнять умеренно дорогую STORE_ATTR, self.l1.extend(l2)а не обязательную.
ShadowRanger
2
Простое сравнение в локальных тестах: для локальной переменной (то +=есть просто используется STORE_FAST, что очень дешево), где добавляемое значение представляет собой существующее listс одним элементом в нем, причем операция, повторенная 1000 раз, +=занимает в среднем около 33 нс , в то время как extendзаняло 78 нс, разница 45 нс. Если l1это глобальный (требует более дорогой STORE_GLOBAL), разница сужается до 17 нс. Если l1на самом деле local.l1(требует еще дороже STORE_ATTR), нет значимой разницы между +=и extend(время примерно одинаковое; extendиногда выигрывает).
ShadowRanger
121
appendдобавляет один элемент. extendдобавляет список элементов.
Обратите внимание, что если вы передаете список для добавления, он все равно добавляет один элемент:
>>> a =[1,2,3]>>> a.append([4,5,6])>>> a[1,2,3,[4,5,6]]
С помощью append вы можете добавить один элемент, который расширит список:
>>> a =[1,2]>>> a.append(3)>>> a[1,2,3]
Если вы хотите расширить более одного элемента, вам следует использовать extension, потому что вы можете добавить только один элемент или один список элементов:
>>> a.append([4,5])>>> a>>>[1,2,3,[4,5]]
Так что вы получите вложенный список
Вместо того, чтобы с расширением, вы можете расширить один элемент, как это
>>> a =[1,2]>>> a.extend([3])>>> a[1,2,3]
Или, в отличие от append, расширяйте больше элементов за один раз, не вкладывая список в исходный (по этой причине расширение имени)
>>> a.extend([4,5,6])>>> a[1,2,3,4,5,6]
Добавление одного элемента с обоими методами
И добавление, и расширение могут добавить один элемент в конец списка, хотя добавить проще.
добавить 1 элемент
>>> x =[1,2]>>> x.append(3)>>> x[1,2,3]
расширить один элемент
>>> x =[1,2]>>> x.extend([3])>>> x[1,2,3]
Добавление большего количества элементов ... с разными результатами
Если вы используете append для более чем одного элемента, вы должны передать список элементов в качестве аргументов, и вы получите список NESTED!
>>> x =[1,2]>>> x.append([3,4])>>> x[1,2,[3,4]]
Вместо того, чтобы расширить, вы передаете список в качестве аргумента, но вы получите список с новым элементом, который не вложен в старый.
>>> z =[1,2]>>> z.extend([3,4])>>> z[1,2,3,4]
Таким образом, с большим количеством элементов вы будете использовать extension, чтобы получить список с большим количеством элементов. Однако добавление списка не добавит больше элементов в список, а добавит один элемент, который является вложенным списком, что можно ясно увидеть в выходных данных кода.
Расширение на моей машине примерно в 4 раза быстрее, чем добавление в цикле (16us против 4us для 100 циклов нулей)
Alex L
6
extend()вероятно, предварительно выделяет, а append()скорее нет.
Безумный физик
@MadPhysicist: Ради полноты, бывали моменты, когда extend()нельзя разумно предварительно распределить, так как некоторые итерируемые элементы не реализуются __len__(), но, как и вы, я бы удивился, если бы он не попытался. Некоторый прирост производительности также достигается за счет выполнения итерационной части в чистом C, а не в Python, как указано в ответе Аарона .
Сорен Бьорнстад
44
append()Метод добавляет один элемент в конец списка.
x =[1,2,3]
x.append([4,5])
x.append('abc')print(x)# gives you[1,2,3,[4,5],'abc']
extend()Метод принимает один аргумент, список, и добавляет каждый из элементов аргумента к первоначальному списку. (Списки реализованы в виде классов. «Создание» списка действительно создает экземпляр класса. Таким образом, в списке есть методы, которые работают с ним.)
x =[1,2,3]
x.extend([4,5])
x.extend('abc')print(x)# gives you[1,2,3,4,5,'a','b','c']
Вы не можете расширить только с 6, так как это не повторяется. И второй вывод в вашем примере неверен. 'abc' добавляется как один элемент, так как вы передали его в extendвиде списка с одним элементом ['abc']: [1, 2, 3, 4, 5, 'abc']. Для того, чтобы ваш пример вывода правильно, измените Азбуки строку: x.extend('abc'). И удалите x.extend(6)или измените его на x.extend([6]).
анероид
37
Вы можете использовать «+» для возврата расширения, вместо расширения на месте.
Аналогично +=для поведения на месте, но с небольшими отличиями от append& extend. Одно из самых больших отличий +=от appendи extendзаключается в том, когда он используется в областях функций, см. Этот пост в блоге .
append(object) - Обновляет список, добавляя объект в список.
x =[20]# List passed to the append(object) method is treated as a single object.
x.append([21,22,23])# Hence the resultant list length will be 2print(x)-->[20,[21,22,23]]
extend(list) - По сути, объединяет два списка.
x =[20]# The parameter passed to extend(list) method is treated as a list.# Eventually it is two lists being concatenated.
x.extend([21,22,23])# Here the resultant list's length is 4print(x)[20,21,22,23]
Интересный момент, который был намекнут, но не объяснен, состоит в том, что расширение быстрее, чем добавление. Любой цикл, который имеет добавление внутри, должен рассматриваться как замененный list.extend (processing_elements).
Имейте в виду, что добавление новых элементов может привести к перераспределению всего списка в лучшее место в памяти. Если это делается несколько раз, потому что мы добавляем 1 элемент за раз, общая производительность страдает. В этом смысле list.extend аналогичен "" .join (stringlist).
Добавить добавляет все данные сразу. Все данные будут добавлены во вновь созданный индекс. С другой стороны, extendкак следует из названия, расширяет текущий массив.
Английский словарь определяет слова appendи extendкак:
добавить : добавить (что-то) в конец письменного документа. расширить : сделать больше. Увеличить или расширить
С этим знанием теперь давайте разберемся
1) разница между appendиextend
append:
Добавляет любой объект Python как есть в конец списка (то есть как последний элемент в списке).
Результирующий список может быть вложенным и содержать разнородные элементы (например, список, строка, кортеж, словарь, набор и т. Д.)
extend:
Принимает любую итерацию в качестве аргумента и увеличивает список .
Результирующий список всегда является одномерным списком (т.е. без вложенности), и он может содержать гетерогенные элементы в нем (например, символы, целые числа, число с плавающей точкой) в результате применения list(iterable).
2) Сходство между appendиextend
Оба принимают ровно один аргумент.
Оба изменяют список на месте .
В результате оба возвращаются None.
пример
lis =[1,2,3]# 'extend' is equivalent to this
lis = lis + list(iterable)# 'append' simply appends its argument as the last element to the list# as long as the argument is a valid Python object
list.append(object)
Я надеюсь, что смогу сделать полезное дополнение к этому вопросу. Если в вашем списке хранится объект определенного типа, например Info, вот ситуация, в которой extendметод не подходит: в forцикле и при Infoкаждом создании объекта и использовании его extendдля сохранения в вашем списке это не удастся. Исключение как ниже:
TypeError: объект 'Info' не повторяется
Но если вы используете appendметод, результат в порядке. Потому что каждый раз, когда используется extendметод, он всегда будет обрабатывать его как список или любой другой тип коллекции, повторять его и размещать после предыдущего списка. Конкретный объект не может быть повторен, очевидно.
append«расширяет» список (на месте) только одним элементом , переданным одним объектом (в качестве аргумента).
extend«расширяет» список (на месте) на столько элементов, сколько содержится в передаваемом объекте (в качестве аргумента).
Это может быть немного запутанным для strобъектов.
Если вы передадите строку в качестве аргумента:
appendв конце добавится один строковый элемент, но
extendбудет добавлено столько «одиночных» str-элементов, сколько длина этой строки.
Если вы передадите список строк в качестве аргумента:
appendвсе равно добавит один элемент «список» в конце и
extendдобавит столько элементов «список», сколько длина переданного списка.
def append_o(a_list, element):
a_list.append(element)print('append:', end =' ')for item in a_list:print(item, end =',')print()def extend_o(a_list, element):
a_list.extend(element)print('extend:', end =' ')for item in a_list:print(item, end =',')print()
append_o(['ab'],'cd')
extend_o(['ab'],'cd')
append_o(['ab'],['cd','ef'])
extend_o(['ab'],['cd','ef'])
append_o(['ab'],['cd'])
extend_o(['ab'],['cd'])
Присоединение и расширение являются одним из механизмов расширения в Python.
Добавить: Добавляет элемент в конец списка.
my_list =[1,2,3,4]
Чтобы добавить новый элемент в список, мы можем использовать метод append следующим образом.
my_list.append(5)
Местоположение по умолчанию, в которое будет добавлен новый элемент, всегда находится в позиции (длина + 1).
Вставка: метод вставки был использован для преодоления ограничений добавления. С помощью вставки мы можем явно определить точное положение, в которое мы хотим вставить наш новый элемент.
Дескриптор метода вставки (индекс, объект). Он принимает два аргумента: во-первых, это индекс, который мы хотим вставить в наш элемент, а во-вторых, сам элемент.
Расширить: это очень полезно, когда мы хотим объединить два или более списков в один список. Без расширения, если мы хотим объединить два списка, результирующий объект будет содержать список списков.
a =[1,2]
b =[3]
a.append(b)print(a)[1,2,[3]]
Если мы попытаемся получить доступ к элементу в позиции 2, мы получим список ([3]) вместо элемента. Чтобы объединить два списка, нам нужно использовать команду append.
extend
и просто использование оператора сложения - в приведенном выше примереx = x + [4, 5]
?x + [4, 5]
дает вам новый список, назначенный х -x.extend()
мутирует оригинальный список. Я уточню в своем ответе здесь ниже.x += [4,5]
.append
- Object . Если вы попытаетесь использоватьextend
и передадите словарь , он добавит ключ , а не весь хеш в конец массива.append
добавляет элемент в список иextend
объединяет первый список с другим списком (или другим итеративным, не обязательно списком).источник
append
добавляет свой аргумент как отдельный элемент в конец списка. Длина самого списка увеличится на единицу.extend
перебирает свой аргумент, добавляя каждый элемент в список, расширяя список. Длина списка будет увеличиваться, сколько бы элементов ни было в итерируемом аргументе.append
list.append
Метод добавляет объект в конец списка.Каким бы ни был объект, будь то число, строка, другой список или что-то еще, он добавляется в конец
my_list
как отдельная запись в списке.Так что имейте в виду, что список - это объект. Если вы добавите другой список в список, первый список будет одним объектом в конце списка (что может не соответствовать вашему желанию):
extend
list.extend
Метод расширяет список путем добавления элементов из итератора:Таким образом, при расширении каждый элемент повторяемого элемента добавляется в список. Например:
Имейте в виду, что строка является итеративной, поэтому, если вы расширяете список строкой, вы добавляете каждый символ во время итерации по строке (что может не соответствовать вашему желанию):
Перегрузка оператора,
__add__
(+
) и__iadd__
(+=
)Оба
+
и+=
операторы определены дляlist
. Они семантически похожи на расширение.my_list + another_list
создает третий список в памяти, так что вы можете вернуть его результат, но для этого требуется, чтобы второй итерируемый был список.my_list += another_list
модифицирует список на месте (он является оператором на месте, и списки изменяемые объекты, как мы уже видели) , поэтому он не создает новый список. Это также работает как расширение, так как вторая итерация может быть любой итерацией.Не запутайтесь -
my_list = my_list + another_list
это не эквивалентно+=
- это дает вам новый список, назначенный my_list.Сложность времени
Добавить имеет постоянную сложность по времени , O (1).
Расширение имеет временную сложность, O (k).
Итерация по многочисленным вызовам
append
добавляет сложность, делая ее эквивалентной расширению, и поскольку итерация расширения реализована в C, она всегда будет быстрее, если вы намереваетесь добавлять последовательные элементы из итерируемого в список.Представление
Вы можете задаться вопросом, что является более производительным, поскольку append можно использовать для достижения того же результата, что и extension. Следующие функции делают то же самое:
Итак, давайте их время:
Обращаясь к комментарию по времени
Комментатор сказал:
Делайте семантически правильную вещь. Если вы хотите добавить все элементы в итерацию, используйте
extend
. Если вы просто добавляете один элемент, используйтеappend
.Итак, давайте создадим эксперимент, чтобы увидеть, как это работает во времени:
И мы видим, что выход из нашего пути создания итерируемого простого использования расширения - это (незначительная) трата времени:
Из этого мы узнаем, что нет ничего полезного,
extend
когда у нас есть только один элемент для добавления.Кроме того, эти сроки не так важны. Я просто показываю им, чтобы подчеркнуть, что в Python делать семантически правильные вещи - значит делать все правильно .
Вполне возможно, что вы можете протестировать время для двух сопоставимых операций и получить неоднозначный или обратный результат. Просто сосредоточьтесь на том, чтобы делать семантически правильную вещь.
Вывод
Мы видим , что
extend
семантический яснее, и что он может работать намного быстрее , чемappend
, если вы собираетесь добавить каждый элемент итератора в список.Если у вас есть только один элемент (не в итерируемом) для добавления в список, используйте
append
.источник
ex1 = 0
иex2 = [0]
) и передать эти переменные, если вы хотите быть более строгими.l1 += l2
противl1.extend(l2)
?l1 += l2
и вl1.extend(l2)
конечном итоге выполнить тот же код (list_extend
функция вlistobject.c
). Единственными отличиями являются: 1.+=
переназначениеl1
(само по себе дляlist
s, но переназначение поддерживает неизменяемые типы, которые не совпадают с объектом после), что делает его недопустимым, еслиl1
на самом деле является атрибутом неизменяемого объекта; например,t = ([],)
,t[0] += lst
потерпит неудачу, в то время какt[0].extend(lst)
будет работать. 2.l1 += l2
использует выделенные байт-коды, аl1.extend(l2)
использует обобщенный метод диспетчеризации; это делает+=
быстрее чемextend
.+=
необходимо переназначитьl1
, означает, что в некоторых случаях более медленная отправкаextend
частично или полностью компенсируется отсутствием повторного присвоения левой стороне. Например, еслиlist
атрибут является атрибутом объектаself.l1 += l2
иself.l1.extend(l2)
имеет одинаковую производительность в моей установке Python 3.6, просто потому, что реальная операция больше похожаself.l1 = self.l1.__iadd__(l2)
, что означает, что она должна выполнять умеренно дорогуюSTORE_ATTR
,self.l1.extend(l2)
а не обязательную.+=
есть просто используетсяSTORE_FAST
, что очень дешево), где добавляемое значение представляет собой существующееlist
с одним элементом в нем, причем операция, повторенная 1000 раз,+=
занимает в среднем около 33 нс , в то время какextend
заняло 78 нс, разница 45 нс. Еслиl1
это глобальный (требует более дорогойSTORE_GLOBAL
), разница сужается до 17 нс. Еслиl1
на самом делеlocal.l1
(требует еще дорожеSTORE_ATTR
), нет значимой разницы между+=
иextend
(время примерно одинаковое;extend
иногда выигрывает).append
добавляет один элемент.extend
добавляет список элементов.Обратите внимание, что если вы передаете список для добавления, он все равно добавляет один элемент:
источник
Добавить против Расширить
С помощью append вы можете добавить один элемент, который расширит список:
Если вы хотите расширить более одного элемента, вам следует использовать extension, потому что вы можете добавить только один элемент или один список элементов:
Так что вы получите вложенный список
Вместо того, чтобы с расширением, вы можете расширить один элемент, как это
Или, в отличие от append, расширяйте больше элементов за один раз, не вкладывая список в исходный (по этой причине расширение имени)
Добавление одного элемента с обоими методами
И добавление, и расширение могут добавить один элемент в конец списка, хотя добавить проще.
добавить 1 элемент
расширить один элемент
Добавление большего количества элементов ... с разными результатами
Если вы используете append для более чем одного элемента, вы должны передать список элементов в качестве аргументов, и вы получите список NESTED!
Вместо того, чтобы расширить, вы передаете список в качестве аргумента, но вы получите список с новым элементом, который не вложен в старый.
Таким образом, с большим количеством элементов вы будете использовать extension, чтобы получить список с большим количеством элементов. Однако добавление списка не добавит больше элементов в список, а добавит один элемент, который является вложенным списком, что можно ясно увидеть в выходных данных кода.
источник
Следующие два фрагмента семантически эквивалентны:
а также
Последнее может быть быстрее, поскольку цикл реализован на C.
источник
extend()
вероятно, предварительно выделяет, аappend()
скорее нет.extend()
нельзя разумно предварительно распределить, так как некоторые итерируемые элементы не реализуются__len__()
, но, как и вы, я бы удивился, если бы он не попытался. Некоторый прирост производительности также достигается за счет выполнения итерационной части в чистом C, а не в Python, как указано в ответе Аарона .append()
Метод добавляет один элемент в конец списка.extend()
Метод принимает один аргумент, список, и добавляет каждый из элементов аргумента к первоначальному списку. (Списки реализованы в виде классов. «Создание» списка действительно создает экземпляр класса. Таким образом, в списке есть методы, которые работают с ним.)От погружения в Python .
источник
extend
виде списка с одним элементом['abc']
: [1, 2, 3, 4, 5, 'abc']. Для того, чтобы ваш пример вывода правильно, измените Азбуки строку:x.extend('abc')
. И удалитеx.extend(6)
или измените его наx.extend([6])
.Вы можете использовать «+» для возврата расширения, вместо расширения на месте.
Аналогично
+=
для поведения на месте, но с небольшими отличиями отappend
&extend
. Одно из самых больших отличий+=
отappend
иextend
заключается в том, когда он используется в областях функций, см. Этот пост в блоге .источник
append(object)
- Обновляет список, добавляя объект в список.extend(list)
- По сути, объединяет два списка.источник
extend()
может использоваться с аргументом итератора. Вот пример. Вы хотите сделать список из списка списков следующим образом:От
ты хочешь
Вы можете использовать
itertools.chain.from_iterable()
для этого. Выход этого метода является итератором. Его реализация эквивалентнаВозвращаясь к нашему примеру, мы можем сделать
и получить список разыскиваемых.
Вот как
extend()
можно эквивалентно использовать аргумент итератора:источник
Это эквивалент
append
иextend
использование+
оператора:источник
append () : в основном используется в Python для добавления одного элемента.
extend () : где extension () используется для объединения двух списков или вставки нескольких элементов в один список.
источник
Интересный момент, который был намекнут, но не объяснен, состоит в том, что расширение быстрее, чем добавление. Любой цикл, который имеет добавление внутри, должен рассматриваться как замененный list.extend (processing_elements).
Имейте в виду, что добавление новых элементов может привести к перераспределению всего списка в лучшее место в памяти. Если это делается несколько раз, потому что мы добавляем 1 элемент за раз, общая производительность страдает. В этом смысле list.extend аналогичен "" .join (stringlist).
источник
Добавить добавляет все данные сразу. Все данные будут добавлены во вновь созданный индекс. С другой стороны,
extend
как следует из названия, расширяет текущий массив.Например
С
append
мы получаем:Пока
extend
мы получаем:источник
Английский словарь определяет слова
append
иextend
как:добавить : добавить (что-то) в конец письменного документа.
расширить : сделать больше. Увеличить или расширить
С этим знанием теперь давайте разберемся
1) разница между
append
иextend
append
:extend
:list(iterable)
.2) Сходство между
append
иextend
None
.пример
источник
Я надеюсь, что смогу сделать полезное дополнение к этому вопросу. Если в вашем списке хранится объект определенного типа, например
Info
, вот ситуация, в которойextend
метод не подходит: вfor
цикле и приInfo
каждом создании объекта и использовании егоextend
для сохранения в вашем списке это не удастся. Исключение как ниже:Но если вы используете
append
метод, результат в порядке. Потому что каждый раз, когда используетсяextend
метод, он всегда будет обрабатывать его как список или любой другой тип коллекции, повторять его и размещать после предыдущего списка. Конкретный объект не может быть повторен, очевидно.источник
Различать их интуитивно
Это как
l1
воспроизводить тело внутри ее тела (вложенное).Это похоже на то, что два раздельных человека женятся и создают дружную семью.
Кроме того, я делаю исчерпывающую таблицу всех методов списка для вашей справки.
источник
extend(L)
расширяет список, добавляя все элементы в данном спискеL
.источник
append
«расширяет» список (на месте) только одним элементом , переданным одним объектом (в качестве аргумента).extend
«расширяет» список (на месте) на столько элементов, сколько содержится в передаваемом объекте (в качестве аргумента).Это может быть немного запутанным для
str
объектов.append
в конце добавится один строковый элемент, ноextend
будет добавлено столько «одиночных» str-элементов, сколько длина этой строки.append
все равно добавит один элемент «список» в конце иextend
добавит столько элементов «список», сколько длина переданного списка.производит:
источник
Присоединение и расширение являются одним из механизмов расширения в Python.
Добавить: Добавляет элемент в конец списка.
Чтобы добавить новый элемент в список, мы можем использовать метод append следующим образом.
Местоположение по умолчанию, в которое будет добавлен новый элемент, всегда находится в позиции (длина + 1).
Вставка: метод вставки был использован для преодоления ограничений добавления. С помощью вставки мы можем явно определить точное положение, в которое мы хотим вставить наш новый элемент.
Дескриптор метода вставки (индекс, объект). Он принимает два аргумента: во-первых, это индекс, который мы хотим вставить в наш элемент, а во-вторых, сам элемент.
Расширить: это очень полезно, когда мы хотим объединить два или более списков в один список. Без расширения, если мы хотим объединить два списка, результирующий объект будет содержать список списков.
Если мы попытаемся получить доступ к элементу в позиции 2, мы получим список ([3]) вместо элемента. Чтобы объединить два списка, нам нужно использовать команду append.
Чтобы присоединиться к нескольким спискам
источник