Оператор приращения python имеет странное поведение в одной строке условного оператора - PullRequest
0 голосов
/ 29 августа 2018

Почему idcter не сбрасывается в 0, когда оно превышает maxid?

maxid=9999
idcter=9999
idcter += 1 if(idcter <= maxid) else 0
print('this is good: ' + str(idcter))

idcter += 1 if(idcter <= maxid) else 0
print('now this is weird: ' + str(idcter))

idcter=10000
idcter = idcter + 1 if(idcter <= maxid) else 0
print("that's better: " + str(idcter))

Выход:

this is good: 10000
now this is weird: 10000
that's better: 0

Так что это простое исправление, но почему бы idcter не сбрасываться после того, как оно превысит maxid?

1 Ответ

0 голосов
/ 29 августа 2018

Приоритет оператора

idcter += 1 if (idcter <= maxid) else 0

визуализируется следующей группировкой

idcter += (1 if (idcter <= maxid) else 0)

, что означает увеличение на 0, если условие не выполняется.

Сравните это с

idcter = idcter + 1 if (idcter <= maxid) else 0
# ==
idcter = (idcter + 1) if (idcter <= maxid) else 0

Где вы присваиваете 0 результату в том же случае.

Кстати, 10000 уже превышает maxid из 9999. Один типичный способ реализации такого приращения сброса использует оператор по модулю. В вашем случае:

idcter = (idcter+1) % (maxid+1)  # 9997 -> 9998 -> 9999 -> 0 -> 1
...