Поведение инкрементных и декрементных операторов в Python

Это старый (паскаль) синтаксис для оператора присваивания. Он будет использоваться так:

a := 45;

Он может быть и на других языках, возможно, аналогичным образом.

715
задан Alex.K. 3 December 2014 в 13:17
поделиться

2 ответа

++ не является оператором. Это два оператора + . Оператор + - это оператор тождества , который ничего не делает. (Уточнение: унарные операторы + и - работают только с числами, но я предполагаю, что вы не ожидаете, что гипотетический оператор ++ будет работать со строками .)

++count

Анализирует как

+(+count)

, что переводится как

count

Вы должны использовать немного более длинный оператор + = , чтобы делать то, что вы хотите сделать:

count += 1

Я подозреваю, что + Операторы + и - были опущены для согласованности и простоты. Я не знаю точных аргументов Гвидо ван Россума в пользу своего решения, но могу представить несколько аргументов:

  • Более простой синтаксический анализ. Технически синтаксический анализ ++ count неоднозначен, поскольку это могло быть + , + , count (два унарных оператора + ) так же легко, как и + + , count (один унарный ++ оператор). Это не значительная синтаксическая двусмысленность, но она существует.
  • Более простой язык. ++ - не более чем синоним + = 1 . Это сокращение было изобретено, потому что компиляторы C были глупы и не знали, как оптимизировать a + = 1 в инструкцию inc , которая есть на большинстве компьютеров. В наши дни оптимизации компиляторов и языков, интерпретируемых с помощью байт-кода, добавление операторов к языку, позволяющих программистам оптимизировать свой код, обычно не одобряется, особенно в таких языках, как Python, который разработан, чтобы быть последовательным и читаемым.
  • Непонятные побочные эффекты. Одна из распространенных ошибок новичков в языках с операторами ++ - это смешивание различий (как в приоритете, так и в возвращаемом значении) между операторами пре- и пост-инкремента / декремента, а Python любит устранять языковые ошибки "-с. Проблемы приоритета пре- / пост-инкремента в C довольно сложны, и их невероятно легко испортить.
988
ответ дан 22 November 2019 в 21:26
поделиться

Когда вы хотите увеличить или уменьшить, вы обычно хотите сделать это с целым числом. Примерно так:

b++

Но в Python целые числа неизменяемы . То есть вы не можете их изменить. Это связано с тем, что целые объекты могут использоваться под несколькими именами. Попробуйте следующее:

>>> b = 5
>>> a = 5
>>> id(a)
162334512
>>> id(b)
162334512
>>> a is b
True

a и b выше на самом деле являются одним и тем же объектом. Если вы увеличили a, вы также увеличите b. Это не то, что вам нужно. Значит, придется переназначить. Примерно так:

b = b + 1

Или проще:

b += 1

Что переназначит b на b + 1 . Это не оператор приращения, потому что он не увеличивает b , а переназначает его.

Вкратце: Python ведет себя здесь по-другому, потому что это не C и не является низкоуровневой оболочкой для машины. код, но это высокоуровневый динамический язык, где приращения не имеют смысла,

379
ответ дан 22 November 2019 в 21:26
поделиться
Другие вопросы по тегам:

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