Python 字符串格式化与字符串乘法的奇怪现象

4 投票
2 回答
4801 浏览
提问于 2025-04-15 13:46

我在用Python的时候,发现它在做字符串的乘法,而我其实想要的是数字的乘法,我搞不懂为什么会这样。

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

即使我强制把类型改成整数,也没什么用。(我知道这样做有点多余,但这是我自己检查的方式:)

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

显然我解决了我的问题(加上括号就可以了),但这到底是怎么回事呢?如果这只是个我需要记住的小怪癖,那也没问题,但我更想理解背后的逻辑。

2 个回答

2

啊,我想我明白了。就在我发完消息之后,当然。其实这是一个运算顺序的问题。字符串格式化正在被计算,而得到的字符串又和最后一个操作数进行了字符串的重复。

当我输入:

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

结果就好像我这样指定了优先级:

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

你遇到的是运算符优先级的问题。

在Python中,%*的优先级是一样的,所以它们是从左到右进行分组的。

所以,

print('%d' % 2 * 4)

和下面这个是一样的,

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

这里有一个Python的运算符优先级表

因为记住运算符优先级的规则比较难,而且这些规则有时候很微妙,所以在表达式中使用多个运算符时,最好还是明确地加上括号。

撰写回答