簡體   English   中英

在Python中,為什么我可以將一個字符串乘以一個數字,但我不能將一個字符串和一個數字相加?

[英]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 的形式。 我們如何知道存在哪些重載定義?

參考: https://docs.python.org/2/library/operator.html

這是否是一個隨意選擇,以便使用字符串和Int arg的定義重載*,而不使用String和Int的重載+?

從本質上講,是的。 但是,值得注意的是,您所討論的兩個操作並非真正並行。 'a' * 4 ,兩個部分的用法不同:字符串用作字符串,數字用作數字。 這里沒有類型轉換。 另請注意, 'a' * 44 * 'a' ,因為兩個操作數的類型清楚地說明了它們的作用,因此順序無關緊要。

如果(如您希望的那樣)起作用,那么'a' + 4給出了'a4' ,那將是另一種操作。 那將隱式地使一種類型的行為像另一種類型(此處將int隱式轉換為字符串)。 這會導致很多混亂。 例如,如果您執行'1' + 2 ,您應該得到數字12還是字符串'12' 如果您做1 + '2'怎么辦? 1 + '2'行為應該不同於1 + 'blah'嗎? 如果您不再依靠對象類型來做出決定,則必須決定其他方式,而這些其他方式都不是顯而易見的或一致的。 您將再次不得不做出任意選擇,例如“始終轉換為第一個參數的類型”或“始終轉換為字符串”。

Python通常不會打開這樣的蠕蟲病毒,而通常避免使用運算符重載來進行隱式類型轉換。 在可以對不同類型執行操作的情況下(例如,字符串乘法),行為被專門定義為利用每種類型,而不是將其轉換為其他類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM