在Python,下面的代碼產生一個錯誤:爲什麼在連接字符串時Python不執行類型轉換?
a = 'abc'
b = 1
print(a + b)
(錯誤是 「類型錯誤:不能連接 'STR' 和 'INT' 對象」)。
爲什麼Python解釋器在遇到這些類型的連接時不會自動嘗試使用str()函數?
在Python,下面的代碼產生一個錯誤:爲什麼在連接字符串時Python不執行類型轉換?
a = 'abc'
b = 1
print(a + b)
(錯誤是 「類型錯誤:不能連接 'STR' 和 'INT' 對象」)。
爲什麼Python解釋器在遇到這些類型的連接時不會自動嘗試使用str()函數?
的問題是,轉換是不明確的,因爲+
既指字符串連接和數字加法。下面的問題同樣有效:
Why does the Python interpreter not automatically try using the int() function when it encounters addition of these types?
這正是不幸的折磨Javascript的寬鬆輸入問題。
這種操作存在很大程度的模糊性。假設情況相反:
a = '4'
b = 1
print(a + b)
目前尚不清楚,如果a
應強制爲一個整數(導致5
),或者如果b
應強制轉換爲字符串(導致'41'
)。由於類型雜耍規則是可傳遞的,所以將數字字符串傳遞給期望數字的函數可能會讓你陷入困境,特別是因爲幾乎所有的算術運算符都對字符串進行了重載操作。例如,在Javascript中,爲了確保處理整數而不是字符串,通常的做法是將變量乘以一;在Python中,乘法運算符重複字符串,因此'41' * 1
是無操作的。要求開發人員澄清可能會更好。
因爲在連接字符串時Python不執行類型轉換。這種行爲是有目的的,當你需要將對象強制轉換爲字符串或數字時,你應該養成執行顯式類型轉換的習慣。
你的代碼更改爲:
a = 'abc'
b = 1
print(a + str(b))
,你就會看到期望的結果。
Python必須知道字符串中的內容才能正確執行。有一個模棱兩可的情況:'5' + 5
應該產生什麼?一個數字或字符串?這肯定會引發錯誤。現在要確定這種情況是否成立,python將不得不檢查要告訴的字符串。每次嘗試連接或添加兩件事情時它應該這樣做嗎?最好讓程序員明確地轉換字符串。
更一般地說,像這樣的隱式轉換隻是簡單的混淆!他們很難預測,很難閱讀,也很難調試。
這就是他們如何決定設計語言。可能的原因是,要求對字符串進行明確的轉換可以減少意外行爲的可能性(例如,如果兩個操作數恰好是整數而不是字符串,則爲整數加法)。
其他答案提供了很好的解釋,但沒有提到這個功能被稱爲強打字。執行隱式轉換的語言是Weakly Typed。
告訴蟒蛇的int是消除歧義的「+」操作的列表。
['foo', 'bar'] + [5]
此返回:[ '富', '酒吧',5]
「以模糊度的面,拒絕的誘惑猜測」。 (有人不得不這樣說。) – DSM 2011-06-17 01:50:52
是的,爲什麼不嘗試將'abc'轉換爲int並將它加1?蘋果+香蕉給你什麼? – JBernardo 2011-06-17 01:59:31
@JBernardo水果沙拉? – 2017-05-02 22:30:12