как понять разницу между a+=1
и a=+1
в Python?
кажется, что они разные. когда я отлаживаю их в Python IDLE, у обоих был разный вывод.
Один из них — a += 1
, расширенное присваивание, эквивалентное a = a + 1
, другой — a = +1
, присваивание и унарный плюс, эквивалентный a = 1
. Если a не было нулем, они будут разными
Когда вы спрашиваете о каком-то неожиданном поведении, предоставьте необходимый код и входные данные, чтобы воспроизвести точную проблему и то, что вы ожидали вместо этого. a += 1
в одиночку даст NameError
.
Конечно, они разные - a+=1
устанавливает значение a
в a + 1
и
a=+1
устанавливает значение a
равным 1:
>>> a = 2
>>> a += 1
>>> a
3
>>> a =+1
>>> a
1
a+=1
— это a += 1
, где +=
— это отдельный оператор, означающий то же, что и a = a + 1
.
a=+1
— это a = + 1
, который присваивает + 1
переменной без использования исходного значения a
И +1 == 1
, если это не очевидно
Учти это:
a = 1
a = +1 # Assign Var a to value -> +1
a = +1 # Assign Var a to value -> +1
a = +1 # Assign Var a to value -> +1
a += 1
a += 1
a += 1
print(a) # -> 4
Как видите a = +1
это присвоение переменной (исправлено @adir abargil), но a += 1
действительно добавляет 1 к var a
.
Это то же самое, что и a = a+1, и называется: оператор присваивания
Да, вы правы, он снова определяет переменную, я хотел это объяснить, но в спешке написал, что ничего не делает (для новичка кажется, что ничего не делает, но это неправильно)! Сейчас редактирую :)
Это действительно зависит от типа объекта, на который ссылается a
.
Для случая, когда a
является другим int
:
+=
— это единственный оператор, расширенный оператор присваивания, который вызывает a=a.__add__(1)
для неизменяемых. Он эквивалентен a=a+1
и возвращает новый объект типа int, привязанный к переменной a
.
=+
анализируется как два оператора с использованием обычного порядка операций:
+
— это унарный оператор, работающий со своим правым аргументом и вызывающий специальную функцию a.__pos__()
, подобно тому, как -a
инвертирует a
с помощью унарного оператора a.__neg__()
.=
— обычный оператор присваиванияДля изменяемых объектов +=
вызывает __iadd__()
для добавления на месте, которое должно возвращать измененный исходный объект.
(plus)1
— это просто1
(положительный 1), поэтомуa=+1
— это простоa=1
.(plus)
должно быть+
, но stackoverflow не позволяет мне начать комментарий с+1
:(