假设我们定义了一个函数如下:
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'
答案 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所指出的,这不是类型转换的示例。相反,它或多或少与用于描述有限符号序列的标准符号一致。如果您参考有限自动机等教科书,表示整数 i 表示字符串连接 x i 次。比较常用于连接字符串x + y
和x
的{{1}}(也在Python中)。在该表示法中,y