为什么Python允许str与int相乘?

时间:2015-09-07 05:31:08

标签: python types

假设我们定义了一个函数如下:

def multiply(a, b):
    return a * b

通过传递数字来调用它很明显:

In [5]: multiply(2,3)
Out[5]: 6

但是(令人惊讶的是)知道Python是一种强类型语言:

In [6]: multiply('2', 3)
Out[6]: '222'

或者

In [7]: multiply(3, '2')
Out[7]: '222'

隐式类型转换让我很害怕。 str类型设计决策背后的理由是什么?另一方面,在F#中,不允许:

- '3' * 2;;
  '3' * 2;;
  ------^
/Users/Pac/stdin(14,7): error FS0001: The type 'int' does not match the type 'char'

3 个答案:

答案 0 :(得分:4)

没有进行类型转换,但字符串类型有许多操作,这些操作提供了有用的快捷方式,当您考虑它时非常符合逻辑:

  • 乘以* =重复所以'abcd ' * 4 - > 'abcd abcd abcd abcd '
  • 添加+ =连接以便'abcd' + 'efg' - > 'abcdefg' 'abcd' + 3 - &gt ; TypeError: cannot concatenate 'str' and 'int' objects

找出适用于任何给定类型的操作的技巧是,而不是阅读手册, dir(x)help(x)其中x是该类型的实例,所以:

dir('a')
__add__, __class__, __contains__, __delattr__, __doc__, __eq__, __format__, 
__ge__, __getattribute__, __getitem__, __getnewargs__, __getslice__, __gt__,
__hash__, __init__, __le__, __len__, __lt__, __mod__, __mul__, __ne__, __new__,
__reduce__, __reduce_ex__, __repr__, __rmod__, __rmul__, __setattr__,
__sizeof__, __str__, __subclasshook__, _formatter_field_name_split, _formatter_parser,
capitalize, center, count, decode, encode, endswith, expandtabs, find, format, index,
isalnum, isalpha, isdigit, islower, isspace, istitle, isupper, join, ljust,
lower, lstrip, partition, replace, rfind, rindex, rjust, rpartition, rsplit, rstrip,
split, splitlines, startswith, strip, swapcase, title, translate, upper, zfill

如您所见,这包含用于添加和乘法的运算符__add____mul__

答案 1 :(得分:2)

这是Python的一项功能,请注意3 * '2'不是6。它将字符串的内容乘以3次。

另一个(有用的)例子:

>>> [2] * 3
[2, 2, 2]
  

知道Python是一种强类型语言:

是的,它是强类型的,所以例如'3' + 2不起作用,因为没有任何意义。然而,不同类型的乘法很有用 - 不幸的是,如果你看到一个操作符因强类型输入而失败,那么你就会发现这种情况不一致。

答案 2 :(得分:0)

正如@ Joachim Pileborg所指出的,这不是类型转换的示例。相反,它或多或少与用于描述有限符号序列的标准符号一致。如果您参考有限自动机等教科书,x^i表示整数 i 表示字符串连接 x i 次。比较常用于连接字符串x + yx的{​​{1}}(也在Python中)。在该表示法中,y