В Python, каково различие между “.append ()” и “+ = []”?

Попробуйте, как показано ниже:

 ngOnInit() {
    this.data.getLocation().subscribe( data => {
      this.location = data[0].
      console.log(data)
      this.lat = this.location.latitude;
      this.lng = this.location.longitude; 
      }
    );
  }
118
задан agf 14 March 2012 в 00:44
поделиться

6 ответов

Для Вашего случая единственной разницей является производительность: добавьте вдвое более быстро.

Python 3.0 (r30:67507, Dec  3 2008, 20:14:27) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import timeit
>>> timeit.Timer('s.append("something")', 's = []').timeit()
0.20177424499999999
>>> timeit.Timer('s += ["something"]', 's = []').timeit()
0.41192320500000079

Python 2.5.1 (r251:54863, Apr 18 2007, 08:51:08) [MSC v.1310 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import timeit
>>> timeit.Timer('s.append("something")', 's = []').timeit()
0.23079359499999999
>>> timeit.Timer('s += ["something"]', 's = []').timeit()
0.44208112500000141

В общем случае append добавит один объект к списку, в то время как += скопирует все элементы списка правой стороны в список левой стороны.

Обновление: анализ перфекта

Сравнение байт-кодов мы можем принять это append версия тратит впустую циклы в LOAD_ATTR + CALL_FUNCTION, и + = версия - в BUILD_LIST. По-видимому, BUILD_LIST перевешивает LOAD_ATTR + CALL_FUNCTION.

>>> import dis
>>> dis.dis(compile("s = []; s.append('spam')", '', 'exec'))
  1           0 BUILD_LIST               0
              3 STORE_NAME               0 (s)
              6 LOAD_NAME                0 (s)
              9 LOAD_ATTR                1 (append)
             12 LOAD_CONST               0 ('spam')
             15 CALL_FUNCTION            1
             18 POP_TOP
             19 LOAD_CONST               1 (None)
             22 RETURN_VALUE
>>> dis.dis(compile("s = []; s += ['spam']", '', 'exec'))
  1           0 BUILD_LIST               0
              3 STORE_NAME               0 (s)
              6 LOAD_NAME                0 (s)
              9 LOAD_CONST               0 ('spam')
             12 BUILD_LIST               1
             15 INPLACE_ADD
             16 STORE_NAME               0 (s)
             19 LOAD_CONST               1 (None)
             22 RETURN_VALUE

Мы можем улучшить производительность еще больше путем удаления LOAD_ATTR наверху:

>>> timeit.Timer('a("something")', 's = []; a = s.append').timeit()
0.15924410999923566
157
ответ дан Constantin 24 November 2019 в 01:54
поделиться

В примере Вы дали, нет никакого различия, с точки зрения вывода, между append и +=. Но существует различие между append и + (который вопрос, который первоначально задают о).

>>> a = []
>>> id(a)
11814312
>>> a.append("hello")
>>> id(a)
11814312

>>> b = []
>>> id(b)
11828720
>>> c = b + ["hello"]
>>> id(c)
11833752
>>> b += ["hello"]
>>> id(b)
11828720

Как видете, append и += имейте тот же результат; они добавляют объект к списку, не производя новый список. Используя + добавляют два списка и производят новый список.

47
ответ дан DNS 24 November 2019 в 01:54
поделиться
>>> a=[]
>>> a.append([1,2])
>>> a
[[1, 2]]
>>> a=[]
>>> a+=[1,2]
>>> a
[1, 2]

Посмотрите, что добавляют, добавляет единственный элемент к списку, который может быть чем-либо. +=[] присоединяется к спискам.

39
ответ дан dwc 24 November 2019 в 01:54
поделиться

+ = присвоение. При использовании его, Вы действительно говорите ‘some_list2 = some_list2 + ['something']’. Присвоения включают повторное переплетение, таким образом:

l= []

def a1(x):
    l.append(x) # works

def a2(x):
    l= l+[x] # assign to l, makes l local
             # so attempt to read l for addition gives UnboundLocalError

def a3(x):
    l+= [x]  # fails for the same reason

+ = оператор должен также обычно создавать новый объект списка как list+list, обычно делает:

>>> l1= []
>>> l2= l1

>>> l1.append('x')
>>> l1 is l2
True

>>> l1= l1+['x']
>>> l1 is l2
False

Однако в действительности:

>>> l2= l1
>>> l1+= ['x']
>>> l1 is l2
True

Это вызвано тем, что Python перечисляет реализацию __ iadd __ (), чтобы сделать + = увеличенное короткое замыкание присвоения и назвать list.extend () вместо этого. (Это - что-то вроде странной бородавки это: это обычно делает то, что Вы имели в виду, но по запутывающим причинам.)

В целом, если Вы добавляете/расширяете существующий список, и Вы хотите сохранить ссылку на тот же список (вместо того, чтобы делать новый), лучше быть явным и придерживаться добавления ()/, расширяют () методы.

31
ответ дан bobince 24 November 2019 в 01:54
поделиться
 some_list2 += ["something"]

на самом деле

 some_list2.extend(["something"])

для одного значения нет никакого различия. Состояния документации, что:

s.append(x) то же как s[len(s):len(s)] = [x]
s.extend(x) то же как s[len(s):len(s)] = x

Таким образом, очевидно, s.append(x) то же как s.extend([x])

21
ответ дан vartec 24 November 2019 в 01:54
поделиться

В дополнение к аспектам, описанным в других ответах, добавьте, и + [] имеют совсем другие поведения, когда Вы пытаетесь создать список списков.

>>> list1=[[1,2],[3,4]]
>>> list2=[5,6]
>>> list3=list1+list2
>>> list3
[[1, 2], [3, 4], 5, 6]
>>> list1.append(list2)
>>> list1
[[1, 2], [3, 4], [5, 6]]

list1 + ['5', '6'] добавляет '5' и '6' к list1 как отдельные элементы. list1.append (['5', '6']) добавляет список ['5', '6'] к list1 как единственный элемент.

3
ответ дан Chris Upchurch 24 November 2019 в 01:54
поделиться
Другие вопросы по тегам:

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