什么:
def double(x):
return x+x
或
def double(x):
return x*2
双方应努力:
- 当参数是字符串时,
+
运算符被重载以执行级联;
*
当一个参数是一个字符串时,操作符被重载为“重复”。
对于Python是动态类型,所执行的实际操作的选择将在运行时进行,这取决于操作数的类型。
更正式,引用the documentation:
的*
(乘)运算符生成它的参数的产品。 参数必须都是数字,或者一个参数必须是整数,而另一个必须是序列。在前一种情况下,数字被转换为普通类型,然后相乘。在后一种情况下,执行序列重复;负重复因子产生空序列。
[...]
的+
(加法)操作者产生的其参数的总和。 参数必须都是数字或者都是相同类型的序列。在前一种情况下,数字被转换为普通类型,然后加在一起。在后一种情况下,序列是连接的。
如果你好奇,从源头上或Python3.3.6/Objects/abstract.c
(用于PyNumber_Mul
的代码是很具有可比性):
PyObject *
PyNumber_Add(PyObject *v, PyObject *w)
{
PyObject *result = binary_op1(v, w, NB_SLOT(nb_add));
if (result == Py_NotImplemented) {
PySequenceMethods *m = v->ob_type->tp_as_sequence;
Py_DECREF(result);
if (m && m->sq_concat) {
return (*m->sq_concat)(v, w);
}
result = binop_type_error(v, w, "+");
}
return result;
}
正如你所看到的,解释器将首先尝试执行另外使用为左操作数定义的特殊方法__add__
。如果这个返回NotImplemented
,它将尝试将左操作数解释为一个序列并执行一个级联。
让你的*试图*乘以2? Python中的''foo'* 2 =='foofoo''和 '4 * 2 == 8''。 – 2015-02-11 21:41:53
Python是动态类型的,'*'运算符适用于整数和字符串,所以你不需要关心函数的输入是什么。 – eigenchris 2015-02-11 21:42:18
见下文Jared。 – 2015-02-11 21:44:44