将字符串乘以零

was*_*ans 5 python string computer-science

在计算机科学方面,特别是在Python中,如何解释将字符串乘以零(这是一个int)会产生一个空字符串?

>>> 'hello' * 0
>>> ''
Run Code Online (Sandbox Code Playgroud)

Ste*_*sop 17

按照顺序:

'hello' * 3 == 'hellohellohello'
'hello' * 2 == 'hellohello'
'hello' * 1 == 'hello'
'hello' * 0 == ?
Run Code Online (Sandbox Code Playgroud)

空字符串是唯一继续序列的东西,所以它是那个或未定义的.它是有意义的"字符串的零重复'hello'".

这个序列是一种寻找字符串乘法的归纳定义的方法.我们想要定义它s * (n + 1) == (s * n) + s,当然我们想要定义s * 1 == s.因此n == 0,唯一有意义的值s * 0是空字符串.

数学上,这是因为空字符串''是附加标识.乘法的分布属性是对于任何字符串s和非负整数a,b:

s * (a + b) == s * a + s * b
Run Code Online (Sandbox Code Playgroud)

b == 0,我们看到:

s * a == s * a + s * 0
Run Code Online (Sandbox Code Playgroud)

因此,除非s * 0是字符串加法的标识值,否则字符串乘法不会对整数加法进行分配.

当然,没有必要仅仅因为我们称两个运算符为"乘法"和"加法",那么它们必须是分布式的.实际上,只要涉及负数,Python中的字符串乘法就不会是分布式的.但是,0通过定义s * 0为其他任何东西而排除将是相当反直觉的.

  • @palindrome:你什么意思?如果GvR选择定义''hello'*0`没有结果,而是抛出异常,那就是这样.没有"绝对"的答案,Python是由一个人发明的. (4认同)
  • @JonClements:不,显然''你好'*-2`应该是10个退格字符! (3认同)

Dav*_*nan 6

*运营商的多元化,+运营商是加法.对于数字类型,我们通常期望n*s等于求和s+s+s+...+s中的n副本的位置s.这说明了乘法和加法之间的典型关系.

我们可能期望乘法对于加法是分配的.那是:

n*s + m*s == (n+m)*s
Run Code Online (Sandbox Code Playgroud)

现在,假设m为零.然后这个分配规则产生:

n*s + 0*s == (n+0)*x == n*s
Run Code Online (Sandbox Code Playgroud)

因此很明显,这0*s是附加的身份.

对于字符串,加法运算符是串联.字符串连接的标识是空字符串.从中我们可以得出结论,0*s应该将其定义为空字符串.