2011-06-17 49 views
21

在Python,下面的代碼產生一個錯誤:爲什麼在連接字符串時Python不執行類型轉換?

a = 'abc' 
b = 1 
print(a + b) 

(錯誤是 「類型錯誤:不能連接 'STR' 和 'INT' 對象」)。

爲什麼Python解釋器在遇到這些類型的連接時不會自動嘗試使用str()函數?

+8

「以模糊度的面,拒絕的誘惑猜測」。 (有人不得不這樣說。) – DSM 2011-06-17 01:50:52

+2

是的,爲什麼不嘗試將'abc'轉換爲int並將它加1?蘋果+香蕉給你什麼? – JBernardo 2011-06-17 01:59:31

+1

@JBernardo水果沙拉? – 2017-05-02 22:30:12

回答

27

的問題是,轉換是不明確的,因爲+既指字符串連接數字加法。下面的問題同樣有效:

Why does the Python interpreter not automatically try using the int() function when it encounters addition of these types?

這正是不幸的折磨Javascript的寬鬆輸入問題。

+0

感覺就像你應該能夠從上下文(對print()函數的一個參數)中知道這應該是一個字符串,但是我想你不能在沒有爲函數輸入參數的情況下這樣做。是否有理由像這樣重載'+'運算符? – Symmetric 2011-06-17 22:52:25

+3

除了在編程語言中常見的使用'+'外,沒有什麼具體的原因。其他語言使用不同的運算符來添加和連接; Python可以做同樣的事情。 – 2011-06-22 22:53:45

+0

很高興記住這一點,回答一個相反的問題:-)我喜歡! +1 – tim 2014-06-04 15:31:25

10

這種操作存在很大程度的模糊性。假設情況相反:

a = '4' 
b = 1 
print(a + b) 

目前尚不清楚,如果a應強制爲一個整數(導致5),或者如果b應強制轉換爲字符串(導致'41')。由於類型雜耍規則是可傳遞的,所以將數字字符串傳遞給期望數字的函數可能會讓你陷入困境,特別是因爲幾乎所有的算術運算符都對字符串進行了重載操作。例如,在Javascript中,爲了確保處理整數而不是字符串,通常的做法是將變量乘以一;在Python中,乘法運算符重複字符串,因此'41' * 1是無操作的。要求開發人員澄清可能會更好。

2

因爲在連接字符串時Python不執行類型轉換。這種行爲是有目的的,當你需要將對象強制轉換爲字符串或數字時,你應該養成執行顯式類型轉換的習慣。

你的代碼更改爲:

a = 'abc' 
b = 1 
print(a + str(b)) 

,你就會看到期望的結果。

2

Python必須知道字符串中的內容才能正確執行。有一個模棱兩可的情況:'5' + 5應該產生什麼?一個數字或字符串?這肯定會引發錯誤。現在要確定這種情況是否成立,python將不得不檢查要告訴的字符串。每次嘗試連接或添加兩件事情時它應該這樣做嗎?最好讓程序員明確地轉換字符串。

更一般地說,像這樣的隱式轉換隻是簡單的混淆!他們很難預測,很難閱讀,也很難調試。

1

這就是他們如何決定設計語言。可能的原因是,要求對字符串進行明確的轉換可以減少意外行爲的可能性(例如,如果兩個操作數恰好是整數而不是字符串,則爲整數加法)。

2

其他答案提供了很好的解釋,但沒有提到這個功能被稱爲強打字。執行隱式轉換的語言是Weakly Typed。

5

簡短的回答是因爲Python是一種強類型語言。

這是由Guido所做的設計決定。它可能是真的這樣或那樣,連接strintstrint

最好的解釋,仍然是由Guido給出的一個,你可以檢查它here

+1

強打字本身並不能解釋這一點,但如果Python是強類型和靜態類型的,那麼解釋器可以將函數print(String str)的所有參數轉換爲字符串類型(就像Java對toString()所做的那樣)。這是因爲Python強烈且動態地輸入了這個問題。 – Symmetric 2011-06-18 01:22:26

1

告訴蟒蛇的int是消除歧義的「+」操作的列表。

['foo', 'bar'] + [5] 

此返回:[ '富', '酒吧',5]

相關問題