В чем разница между LIST.append (1) и LIST = LIST + (Python)

Когда я выполняю (я использую интерактивную оболочку) эти утверждения, я получаю следующее:

L=[1,2,3] K=L L.append(4) L [1,2,3,4] K [1,2,3,4] 

Но когда я делаю то же самое, заменяя L.append (4) на L = L + [4], я получаю:

 L [1,2,3,4] K [1,2,3] 

Это какая-то справочная вещь? Почему это происходит?

Еще одна забавная вещь, которую я заметил, это то, что L + = [4] действует как .append, что нечетно, поскольку я думал, что он будет действовать как L = L + [4].

Было бы весьма полезно получить разъяснения по всем этим вопросам.

благодаря

4 Solutions collect form web for “В чем разница между LIST.append (1) и LIST = LIST + (Python)”

 L.append(4) 

Это добавляет элемент в конец существующего списка L

 L += [4] 

Оператор += вызывает магический __iadd__() . Оказывается, list переопределяет метод __iadd__() и делает его эквивалентным extend() который, подобно append() , добавляет элементы непосредственно в существующий список.

 L = L + [4] 

L + [4] генерирует новый список, который равен L с добавлением 4 к концу. Затем этот новый список присваивается L Поскольку вы создали новый объект списка, K не изменяется по этому назначению.

Мы можем использовать id() чтобы определить, когда создается новая ссылка на объект:

 >>> L = [1, 2, 3] >>> id(L) 152678284 >>> L.append(4) >>> id(L) 152678284 >>> L = [1, 2, 3] >>> id(L) 152680524 >>> L = L + [4] >>> id(L) 152678316 

С append вы изменяете список напрямую. С L=L+[4] вы делаете копию оригинала L и добавляете новый элемент, а затем возвращаете этот результат на L и нарушаете его эквивалентность K

Я не уверен в поведении += .

Если вам интересны байт-коды:

 >>> def L_app( ): ... L.append( 4 ) ... >>> def L_add( ): ... L = L + [ 4 ] ... >>> def L_add_inplace( ): ... L += [ 4 ] ... >>> dis.dis( L_app ) 2 0 LOAD_GLOBAL 0 (L) 3 LOAD_ATTR 1 (append) 6 LOAD_CONST 1 (4) 9 CALL_FUNCTION 1 12 POP_TOP 13 LOAD_CONST 0 (None) 16 RETURN_VALUE >>> dis.dis( L_add ) 2 0 LOAD_FAST 0 (L) 3 LOAD_CONST 1 (4) 6 BUILD_LIST 1 9 BINARY_ADD 10 STORE_FAST 0 (L) 13 LOAD_CONST 0 (None) 16 RETURN_VALUE >>> dis.dis( L_add_inplace ) 2 0 LOAD_FAST 0 (L) 3 LOAD_CONST 1 (4) 6 BUILD_LIST 1 9 INPLACE_ADD 10 STORE_FAST 0 (L) 13 LOAD_CONST 0 (None) 16 RETURN_VALUE 

В первом примере имена переменных K и L относятся к одному и тому же объекту, поэтому при вызове метода, изменяющего этот объект, изменения, очевидно, просматриваются с обеих ссылок. Во втором примере + оператор вызывает list.__add__ который возвращает новый объект (конкатенация двух списков), а имя L теперь относится к этому новому объекту, а K – нетронутым.

  • Использование pop для удаления элемента из 2D-массива
  • Python: списки и их копирование
  • Преобразование одного упорядоченного списка в python в словарь, pythonically
  • Быстрое изменение вывода
  • Найти структуру кортежа, содержащую неизвестное значение внутри списка
  • Кодировать список Python для UTF-8
  • Создание списка отдельных элементов списка, умноженных n раз
  • Как получить n-й элемент списка python или по умолчанию, если он недоступен
  • Python - лучший язык программирования в мире.