2016-11-16 1 views
2

Так что я простой кусок кода, который печатает целые числа 1-10:Разница между '+ =' и '= +'?

i = 0 
while i < 10: 
     i += 1 
     print(i) 

Тогда, если вы просто изменить один оператор вокруг на линии 3, он печатает бесконечное количество 1 целых чисел (которые я понять, почему он это делает). Почему не возникает синтаксическая ошибка при запуске этой второй программы? Разве это не вызовет синтаксическую ошибку в случае, если оператор присваивания сопровождается оператором сложения?

i = 0 
while i < 10: 
     i =+ 1 
     print(i) 
+4

'i = + 1' - это то же самое, что и' i = 1'. '+' - это унарный оператор. –

+0

См. [Справочник по языку в унарных выражениях] (https://docs.python.org/3/reference/expressions.html#grammar-token-u_expr) –

ответ

14

i+=1 - это то же самое, что и у i=i+1. i=+1 всего лишь i=(+1).

+2

ОП, похоже, это понимает. Вопрос в том, почему '+ 1' не является незаконным синтаксисом. –

2

i =+ 1 такое же, как i = +1 или i = 1.

5

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

Таким образом, x=+y, x =+ y и x = +y все эквивалентны, во всех случаях, ссылающихся унарную + оператора на y и назначает x. Унарный плюс оператор обычно не используется, но только потому, что он необычен, это не значит, что он не распознается и не принимается.

Для сравнения, --> «оператор» в C/C++ и т. Д. - another example where humans looking for spaces and tokenizers ignoring them causes confusion.

+2

'! -' также был источником некоторой путаницы в [javascript] (http: // stackoverflow.com/q/34323527/1547004) –

0

Синтаксическая ошибка отсутствует, поскольку выражение i =+ 1 совпадает с i = (+1) и +1 совершенно законно. Это унарный оператор, а не оператор сложения.

1

x=+1 трактуется как: x=(+1)
в то время как x+=1 трактуются как: x=x+1

Есть бинарные операторы, которые работают на их левый от входа операнда и их правой часть операнда (например, * умножение).
И есть унарные операторы, которые принимают только правый операнд (например, ~ /! Отрицание). Существуют операторы, которые могут быть унарными и двоичными.

Знак плюса в python может использоваться также как оператор правой руки так же, как минус.

Python Docs:

Унарный - (минус) оператор дает отрицание его числовой аргумента.

Оператор унарного + (плюс) дает свой числовой аргумент без изменений.