+ и + = разные операторы?

>>> c = [1, 2, 3] >>> print(c, id(c)) [1, 2, 3] 43955984 >>> c += c >>> print(c, id(c)) [1, 2, 3, 1, 2, 3] 43955984 >>> del c >>> c = [1, 2, 3] >>> print(c, id(c)) [1, 2, 3] 44023976 >>> c = c + c >>> print(c, id(c)) [1, 2, 3, 1, 2, 3] 26564048 

Какая разница? + = и + не должны быть просто синтаксическим сахаром?

  • Как работают булевы операторы в условиях «если»?
  • В какой ситуации должен использоваться встроенный модуль «operator» в python?
  • Почему в Python нет операторов ++ и -?
  • python и / или операторы возвращают значение
  • Python дополняет несколько переменных inline
  • Есть ли в Python оператор «не равный»?
  • Python - создать список с начальной загрузкой
  • Что следует учитывать перед списком подклассов?
  • В чем разница между `sorted (list)` vs `list.sort ()`? питон
  • Получение значения по умолчанию для индекса вне диапазона в Python
  • Так что же означает «из __future__ import barry_as_FLUFL»?
  • Как отсортировать этот список в Python, если моя дата в String?
  • 4 Solutions collect form web for “+ и + = разные операторы?”

    docs объясняют это очень хорошо , я думаю:

    __iadd__() и т. д.
    Эти методы вызывают для реализации расширенных арифметических заданий ( +=, -=, *=, /=, //=, %=, **=, <<=, >>=, &=, ^=, |= ). Эти методы должны пытаться выполнить операцию на месте (модифицировать « self ) и вернуть результат (который может быть, но не обязательно, self ). Если конкретный метод не определен, расширенное присваивание возвращается к обычным методам. Например, для выполнения оператора x += y , где x является экземпляром класса, который имеет __iadd__() , x.__iadd__(y) .

    += предназначены для реализации модификации на месте. в случае простого добавления создается новый объект, и он помечен с использованием уже используемого имени ( c ).

    Кроме того, вы заметили бы, что такое поведение оператора += возможно только из-за изменчивости списков. Целые числа – неизменный тип – не приведут к такому же результату:

     >>> c = 3 >>> print(c, id(c)) 3 505389080 >>> c += c >>> print(c, id(c)) 6 505389128 

    Они не одинаковы

    c + = c добавить копию содержимого c в c

    c = c + c создать новый объект с c + c

    Для

     foo = [] 

    foo+=foo – синтаксический сахар для foo.extend(foo) (а не foo = foo + foo )

    В первом случае вы просто добавляете членов списка в другой (и не создаете новый).

    id изменяется во втором случае, потому что новый список создается путем добавления двух списков. Случайно, что оба они одинаковы, и результат привязан к одному и тому же идентификатору, чем один раз указывал на них.

    Если вы перефразируете этот вопрос разными списками (а не самим c), он, вероятно, станет более ясным.

    Оператор + = добавляет второй список к первому, но модификация на месте, поэтому идентификатор остается неизменным.

    Когда вы используете +, создается новый список, а окончательный «c» – это новый список, поэтому он имеет другой идентификатор.

    Однако конечный результат для обеих операций одинаковый.

    Python - лучший язык программирования в мире.