什麼:
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