在计算机科学方面,特别是在Python中,如何解释将字符串乘以零(这是一个int)会产生一个空字符串?
>>> 'hello' * 0
>>> ''
答案 0 :(得分:17)
按照顺序:
'hello' * 3 == 'hellohellohello'
'hello' * 2 == 'hellohello'
'hello' * 1 == 'hello'
'hello' * 0 == ?
空字符串是唯一继续序列的东西,所以它是那个或未定义的。它有意义为“字符串'hello'
”的零重复。
此序列是一种寻找字符串乘法的归纳定义的方法。我们想要定义s * (n + 1) == (s * n) + s
,当然我们要定义s * 1 == s
。因此,当n == 0
s * 0
唯一有意义的值是空字符串时。
数学上,这是因为空字符串''
是附加标识。乘法的分布属性是任何字符串s
和非负整数a
,b
:
s * (a + b) == s * a + s * b
放b == 0
,我们看到:
s * a == s * a + s * 0
因此,除非s * 0
是字符串加法的标识值,否则字符串乘法不会对整数加法进行分配。
当然,没有必要仅仅因为我们称两个运算符为“乘法”和“加法”,那么它们必须是分布式的。实际上,只要涉及负数,Python中的字符串乘法就不会是分布式的。但是,通过将0
定义为其他任何内容来排除s * 0
也会违反直觉。
答案 1 :(得分:6)
*
运算符是乘法运算,+
运算符是加法运算符。对于数字类型,我们通常希望n*s
等于s+s+s+...+s
,其中总和中n
个s
个副本。这说明了乘法和加法之间的典型关系。
我们可能期望乘法是分配而不是加法。那就是:
n*s + m*s == (n+m)*s
现在,假设m
为零。然后这个分配规则产生:
n*s + 0*s == (n+0)*x == n*s
因此很明显0*s
是加性身份。
对于字符串,加法运算符是串联。字符串连接的标识是空字符串。我们可以从中得出结论:0*s
应该被定义为空字符串。