Я заметил, что к переменной (например ++count
) можно применить оператор предварительного увеличения / уменьшения . Он компилируется, но фактически не меняет значение переменной!
Каково поведение операторов предварительного увеличения / уменьшения (++ / -) в Python?
Почему Python отличается от поведения этих операторов в C / C ++?
++
и--
операторы?sta x++
... атомарная инструкция, которая в результате сохраняетa
аккумулятор, наx
который указывает, а затем увеличиваетсяx
на размер аккумулятора. Это сделано потому, что это быстрее, чем арифметика указателей, потому что это очень распространено, и потому что это легко понять. Оба до и после.Ответы:
++
не оператор. Это два+
оператора.+
Оператор является личность оператора, который ничего не делает. (Пояснение: унарные операторы+
and и-
работают только с числами, но я предполагаю, что вы не ожидаете, что гипотетический++
оператор будет работать со строками.)Разбирает как
Что переводится как
Вы должны использовать немного более длинный
+=
оператор, чтобы сделать то, что вы хотите сделать:Я подозреваю, что операторы
++
and--
были исключены для последовательности и простоты. Я не знаю точного аргумента, который Гвидо ван Россум дал для решения, но я могу представить несколько аргументов:++count
неоднозначно, так как это может быть+
,+
,count
(две унарные+
операторы) так же легко , как это может быть++
,count
(один унарный++
оператор). Это не значительная синтаксическая неоднозначность, но она существует.++
не более чем синоним+= 1
. Это сокращенная изобретены потому , что компиляторы были глупы и не знают , как оптимизироватьa += 1
вinc
инструкцию большинство компьютеров имеют. В этот день оптимизации компиляторов и интерпретируемых языков байт-кода добавление операторов к языку, позволяющее программистам оптимизировать их код, обычно не одобряется, особенно в языке, подобном Python, который разработан, чтобы быть последовательным и читаемым.++
операторами является смешение различий (как по приоритету, так и по возвращаемому значению) между операторами до и после увеличения / уменьшения, и Python любит исключать языковые "уловки". В вопросы старшинства по предварительной / пост-инкремент в C довольно волосатый, и невероятно легко испортить.источник
+
оператор имеет применение. Для десятичных. Десятичных объектов округляется до текущей точности.+ +
и++
без нарушения LL (1).++
это не что иное, как синоним+= 1
. Существуют до + и постинкрементные варианты ++, так что это явно не одно и то же. Я согласен с остальными вашими пунктами, хотя.Когда вы хотите увеличить или уменьшить, вы обычно хотите сделать это на целое число. Вот так:
Но в Python целые числа неизменны . То есть ты не можешь их изменить. Это потому, что целочисленные объекты могут быть использованы под несколькими именами. Попробуй это:
А и В выше на самом деле один и тот же объект. Если вы увеличиваете a, вы также увеличиваете b. Это не то, что вы хотите. Таким образом, вы должны переназначить. Нравится:
Или проще:
Который будет переназначен
b
наb+1
. Это не оператор приращения, потому что он не увеличиваетсяb
, а переназначает его.Вкратце: Python ведет себя по-другому, потому что это не C, и это не оболочка низкого уровня для машинного кода, а динамический язык высокого уровня, где приращения не имеют смысла, а также не так необходимы, как в C где вы используете их каждый раз, когда у вас есть цикл, например.
источник
i++
означало бы назначитьi + 1
на переменнуюi
.i = 5; i++
средство для назначения6
наi
, не изменяемint
объект , на который указываетi
. То есть это не значит увеличивать значение5
!i++
работает только с lvalues. Если бы это было предназначено для увеличения объекта, на который указываетi
, это ограничение было бы ненужным.В то время как ответы других верны, поскольку они показывают, что
+
обычно делает простое (а именно, оставляют число как есть, если оно единичное), они неполны, поскольку не объясняют, что происходит.Чтобы быть точным, имеет
+x
значениеx.__pos__()
и++x
дляx.__pos__().__pos__()
.Я мог бы представить ОЧЕНЬ странную структуру класса (Дети, не делайте этого дома!), Вот так:
источник
В Python нет этих операторов, но если они вам действительно нужны, вы можете написать функцию с той же функциональностью.
Применение:
Внутри функции вы должны добавить locals () в качестве второго аргумента, если вы хотите изменить локальную переменную, иначе она попытается изменить глобальную переменную.
Также с этими функциями вы можете сделать:
Но, на мой взгляд, следующий подход гораздо понятнее:
Операторы декремента:
Я использовал эти функции в своем модуле, переводя javascript на python.
источник
Википедия
Таким образом, введя такие операторы, вы нарушите разбиение выражения / оператора.
По той же причине, по которой ты не можешь писать
как вы можете в некоторых других языках, где такое различие не сохраняется.
источник
if (n := len(a)) > 10: y = n + 1
например. Обратите внимание, что различие очевидно из-за введения нового оператора для этой цели (:=
)TL; DR
Python не имеет унарных операторов увеличения / уменьшения (
--
/++
). Вместо этого, чтобы увеличить значение, используйтеБольше деталей и ошибок
Но будьте осторожны здесь. Если вы пришли из C, даже это не так в Python. Python не имеет «переменных» в том смысле, в каком это есть в C, вместо этого python использует имена и объекты , а в Python
int
s являются неизменяемыми.так скажем, вы делаете
В Python это означает следующее: создайте объект со
int
значением типа1
и привяжитеa
к нему имя . Объект является экземпляром ,int
имеющим значение1
, а названиеa
относится к нему. Имяa
и объект, к которому оно относится, различны.Теперь скажем, что вы делаете
Поскольку
int
s неизменяемы, то, что здесь происходит, выглядит следующим образом:a
ссылается (этоint
с идентификатором0x559239eeb380
)0x559239eeb380
(оно есть1
)int
объект со значением2
(у него есть идентификатор объекта0x559239eeb3a0
)a
к этому новому объектуa
относится к объекту,0x559239eeb3a0
а исходный объект (0x559239eeb380
) больше не упоминается по имениa
. Если нет других имен, относящихся к исходному объекту, это будет сборщик мусора позже.Попробуйте сами:
источник
Да, я пропустил ++ и - функциональность. Несколько миллионов строк кода на C укоренили такое мышление в моей старой голове, и вместо того, чтобы бороться с ним ... Вот класс, который я создал, который реализует:
Вот это:
Вы можете использовать это так:
... уже имея с, вы могли бы сделать это ...
....или просто...
... и для (пере) назначения в целое число ...
... пока это будет поддерживать c как счетчик типа:
РЕДАКТИРОВАТЬ:
И затем есть это немного неожиданного (и совершенно нежелательного) поведения ,
... потому что внутри этого кортежа getitem () не то, что использовалось, а ссылка на объект передается в функцию форматирования. Вздох. Так:
... или, более подробно и явно, то, что мы на самом деле хотели случиться, хотя в реальной форме противопоставлено многословию (используйте
c.v
вместо) ...источник
В python нет операторов post / pre приращения / декремента, как в таких языках, как C.
Мы можем видеть
++
или--
как умножаются несколько знаков, как мы делаем в математике (-1) * (-1) = (+1).Например
Разбирает как
Что переводится как
Потому что умножение
-
знака со-
знаком+
И наконец,
источник
-----count
.В Python 3.8+ вы можете сделать:
С этим можно много думать.
Или, если вы хотите написать что-то с более сложным синтаксисом (цель не в оптимизации):
Он хорошо возвращает 0, если DOS не существует без ошибок, а затем установит его на 1
источник