[英]In Python, why can I multiply a string by a number, but I can't add a string and a number?
在 Python 中,我們可以這樣做:
'a' * 4
得到'aaaa'。
我們不能這樣做:
'a' + 4
我們首先必須將 4 轉換為字符串。
這只是用 String 和 Int arg 的定義重載 * 而不為 String 和 Int 重載 + 的任意選擇嗎?
我試圖了解這如何適合 Python 被認為是“強類型”,如果我們將其定義為不執行任何隱式類型轉換的語言,例如在上面的示例中它如何不將 4 轉換為字符串。 那么在第一個示例中,這是運算符重載的示例,而不是隱式轉換?
在文檔中,我找不到采用 Int 和 String 的 mul 或 * 的定義,只有采用 2 Int 的形式。 我們如何知道存在哪些重載定義?
這是否是一個隨意選擇,以便使用字符串和Int arg的定義重載*,而不使用String和Int的重載+?
從本質上講,是的。 但是,值得注意的是,您所討論的兩個操作並非真正並行。 在'a' * 4
,兩個部分的用法不同:字符串用作字符串,數字用作數字。 這里沒有類型轉換。 另請注意, 'a' * 4
與4 * 'a'
,因為兩個操作數的類型清楚地說明了它們的作用,因此順序無關緊要。
如果(如您希望的那樣)起作用,那么'a' + 4
給出了'a4'
,那將是另一種操作。 那將隱式地使一種類型的行為像另一種類型(此處將int隱式轉換為字符串)。 這會導致很多混亂。 例如,如果您執行'1' + 2
,您應該得到數字12
還是字符串'12'
? 如果您做1 + '2'
怎么辦? 1 + '2'
行為應該不同於1 + 'blah'
嗎? 如果您不再依靠對象類型來做出決定,則必須決定其他方式,而這些其他方式都不是顯而易見的或一致的。 您將再次不得不做出任意選擇,例如“始終轉換為第一個參數的類型”或“始終轉換為字符串”。
Python通常不會打開這樣的蠕蟲病毒,而通常避免使用運算符重載來進行隱式類型轉換。 在可以對不同類型執行操作的情況下(例如,字符串乘法),行為被專門定義為利用每種類型,而不是將其轉換為其他類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.