Строковое форматирование Python и странность умножения строк - PullRequest
4 голосов
/ 21 августа 2009

Python выполняет умножение строк, где я ожидал, что он умножит числовые значения, и я не знаю, почему.

>>> print('%d' % 2 * 4)
2222
>>> print('%d' % (2 * 4))
8

Даже принудительное приведение типа к целому числу ничего не делает. (Я понимаю, что это избыточно, но для меня это идиотская проверка:

 >>> print('%d' % int(2) * int(4))
 2222

Очевидно, я решил свою проблему (добавив круглые скобки, это делает), но что здесь происходит? Если это просто причуды, которые я должен запомнить, это нормально, но я бы лучше понял логику, стоящую за этим.

Ответы [ 2 ]

12 голосов
/ 21 августа 2009

У вас приоритет оператора .

В питоне % имеет тот же приоритет, что и *, поэтому они группируются слева направо.

Итак,

print('%d' % 2 * 4)

совпадает с

print( ('%d' % 2) * 4)

Вот таблица приоритетов оператора python .

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

2 голосов
/ 21 августа 2009

Ах, думаю, я понял это. Сразу после того, как я отправил сообщение, конечно. Это порядок операций. Форматирование строки вычисляется, а полученная строка умножается на последний операнд.

Когда я печатаю:

>>> print '%d' % 2 * 4
2222

Оказывается, как будто я определил приоритет следующим образом:

>>> print ('%d' % 2) * 4
2222
...