天天看點

python中“TypeError: Can't convert 'int' object to str implicitly"報錯的解決辦法

一、問題

我在嘗試着寫一個文字遊戲,遇到了一個函數錯誤,這個函數實作的功能是:在你輸入完字元後,就會消耗你的技能分。剛開始時報錯資訊顯示我在試圖用一個整數減去一個字元,對應代碼為“balance - strength”,這個錯誤很明顯,是以我将其改為“strength = int(strength)”修複了... 但是現在我遇到了一個以前從未見過的錯誤(o(╯□╰)o我是一個新手),我不知道它試圖在告訴我什麼以及如何修複它。

以下為該函數對應的代碼:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

<code>def</code> <code>attributeSelection():</code>

<code>    </code><code>balance </code><code>=</code> <code>25</code>

<code>    </code><code>print</code><code>(</code><code>"Your SP balance is currently 25."</code><code>)</code>

<code>    </code><code>strength </code><code>=</code> <code>input</code><code>(</code><code>"How much SP do you want to put into strength?"</code><code>)</code>

<code>    </code><code>strength </code><code>=</code> <code>int</code><code>(strength)</code>

<code>    </code><code>balanceAfterStrength </code><code>=</code> <code>balance </code><code>-</code> <code>strength</code>

<code>    </code><code>if</code> <code>balanceAfterStrength </code><code>=</code><code>=</code> <code>0</code><code>:</code>

<code>        </code><code>print</code><code>(</code><code>"Your SP balance is now 0."</code><code>)</code>

<code>        </code><code>attributeConfirmation()</code>

<code>    </code><code>elif</code> <code>strength &lt; </code><code>0</code><code>:</code>

<code>        </code><code>print</code><code>(</code><code>"That is an invalid input. Restarting attribute selection. Keep an eye on your balance this time!"</code><code>)</code>

<code>        </code><code>attributeSelection()</code>

<code>    </code><code>elif</code> <code>strength &gt; balance:</code>

<code>    </code><code>elif</code> <code>balanceAfterStrength &gt; </code><code>0</code> <code>and</code> <code>balanceAfterStrength &lt; </code><code>26</code><code>:</code>

<code>        </code><code>print</code><code>(</code><code>"Ok. You're balance is now at "</code> <code>+</code> <code>balanceAfterStrength </code><code>+</code> <code>" skill points."</code><code>)</code>

<code>    </code><code>else</code><code>:</code>

<code>        </code><code>print</code><code>(</code><code>"That is an invalid input. Restarting attribute selection."</code><code>)</code>

以下為運作此部分代碼後的報錯資訊:

<code>    </code><code>Your SP balance </code><code>is</code> <code>currently </code><code>25.</code>

<code>How much SP do you want to put into strength?</code><code>5</code>

<code>Traceback (most recent call last):</code>

<code>  </code><code>File</code> <code>"C:\Python32\APOCALYPSE GAME LIBRARY\apocalypseGame.py"</code><code>, line </code><code>205</code><code>, </code><code>in</code> <code>&lt;module&gt;</code>

<code>    </code><code>gender()</code>

<code>  </code><code>File</code> <code>"C:\Python32\APOCALYPSE GAME LIBRARY\apocalypseGame.py"</code><code>, line </code><code>22</code><code>, </code><code>in</code> <code>gender</code>

<code>    </code><code>customizationMan()</code>

<code>  </code><code>File</code> <code>"C:\Python32\APOCALYPSE GAME LIBRARY\apocalypseGame.py"</code><code>, line </code><code>54</code><code>, </code><code>in</code> <code>customizationMan</code>

<code>    </code><code>characterConfirmation()</code>

<code>  </code><code>File</code> <code>"C:\Python32\APOCALYPSE GAME LIBRARY\apocalypseGame.py"</code><code>, line </code><code>93</code><code>, </code><code>in</code> <code>characterConfirmation</code>

<code>  </code><code>File</code> <code>"C:\Python32\APOCALYPSE GAME LIBRARY\apocalypseGame.py"</code><code>, line </code><code>85</code><code>, </code><code>in</code> <code>characterConfirmation</code>

<code>    </code><code>attributeSelection()</code>

<code>  </code><code>File</code> <code>"C:\Python32\APOCALYPSE GAME LIBRARY\apocalypseGame.py"</code><code>, line </code><code>143</code><code>, </code><code>in</code> <code>attributeSelection</code>

<code>    </code><code>print</code><code>(</code><code>"Ok. You're balance is now at "</code> <code>+</code> <code>balanceAfterStrength </code><code>+</code> <code>" skill points."</code><code>)</code>

<code>TypeError: Can</code><code>'t convert '</code><code>int</code><code>' </code><code>object</code> <code>to </code><code>str</code> <code>implicitly</code>

(提問者報錯資訊中涉及較多,部分為其項目代碼檔案。為縮短報錯資訊,我将提問者所提到的函數部分代碼粘貼到本機後,運作完對應的報錯資訊如下)

<code>Your SP balance </code><code>is</code> <code>currently </code><code>25.</code>

<code>  </code><code>File</code> <code>"test.py"</code><code>, line </code><code>26</code><code>, </code><code>in</code> <code>&lt;module&gt;</code>

<code>  </code><code>File</code> <code>"test.py"</code><code>, line </code><code>20</code><code>, </code><code>in</code> <code>attributeSelection</code>

<code>TypeError: cannot concatenate </code><code>'str'</code> <code>and</code> <code>'int'</code> <code>objects</code>

有人知道如何解決這個問題嗎?先行感謝。

二、答案

你不能将整型(int)與字元串(string)連在一起。你需要使用'str'函數将整型(int)轉換為字元型(string),或者使用'formatting'格式化輸出。

<code>print</code><code>(</code><code>"Ok. Your balance is now at "</code> <code>+</code> <code>balanceAfterStrength </code><code>+</code> <code>" skill points."</code><code>)</code>

改為:

({}  .format方式)

<code>print</code><code>(</code><code>"Ok. Your balance is now at {} skill points."</code><code>.</code><code>format</code><code>(balanceAfterStrength))</code>

或改為:

(使用str函數轉換類型)

<code>print</code><code>(</code><code>"Ok. Your balance is now at "</code> <code>+</code> <code>str</code><code>(balanceAfterStrength) </code><code>+</code> <code>" skill points."</code><code>)</code>

或按照下面的一條評論所提及的那樣做,使用','将不同的字元串傳遞給print函數,而不是使用'+'連接配接。(涉及的評論為:你不能使用','連接配接字元串;你可以用','将參數分開傳遞給print函數,這些參數會以空格分割,一個接一個的列印出來,)

<code>print</code><code>(</code><code>"Ok. Your balance is now at "</code><code>, balanceAfterStrength, </code><code>" skill points."</code><code>)</code>

三、總結

當同時列印字元及整型變量時,有以下幾種方式來避免“TypeError”報錯。

假設變量temp = 3,要輸出的内容為the number you input is 3.

1.使用str強制将整型轉換為字元型

<code>print</code> <code>'the nume you input is '</code> <code>+</code> <code>str</code><code>(temp)</code>

<code>print</code> <code>'the nume you input is %s'</code> <code>%</code> <code>temp</code>

<code>print</code> <code>'the nume you input is {}'</code> <code>.</code><code>format</code><code>(temp)</code>

4.使用逗号将變量和字元串分隔

<code>print</code> <code>'the nume you input is'</code> <code>, temp</code>

四、% 及 .format() 兩種格式化輸出對比

更多執行個體對比請參考:

<a href="https://pyformat.info/" target="_blank">https://pyformat.info/</a>

<a href="https://github.com/ulope/pyformat.info" target="_blank">https://github.com/ulope/pyformat.info</a>

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

<code>基本輸出</code>

<code>Old    </code><code>'%s %s'</code> <code>%</code> <code>(</code><code>'one'</code><code>, </code><code>'two'</code><code>)</code>

<code>New    </code><code>'{} {}'</code><code>.</code><code>format</code><code>(</code><code>'one'</code><code>, </code><code>'two'</code><code>)</code>

<code>Output    one two</code>

<code>Old    </code><code>'%d %d'</code> <code>%</code> <code>(</code><code>1</code><code>, </code><code>2</code><code>)</code>

<code>New    </code><code>'{} {}'</code><code>.</code><code>format</code><code>(</code><code>1</code><code>, </code><code>2</code><code>)</code>

<code>Output    </code><code>1</code> <code>2</code>

<code>#右對齊</code>

<code>Old    </code><code>'%10s'</code> <code>%</code> <code>(</code><code>'test'</code><code>,)</code>

<code>New    </code><code>'{:&gt;10}'</code><code>.</code><code>format</code><code>(</code><code>'test'</code><code>)</code>

<code>Output        test    </code><code>#test左邊有六個空格 </code>

<code>#左對齊</code>

<code>Old    </code><code>'%-10s'</code> <code>%</code> <code>(</code><code>'test'</code><code>,)</code>

<code>New    </code><code>'{:10}'</code><code>.</code><code>format</code><code>(</code><code>'test'</code><code>)</code>

<code>Output    test       </code><code>#test右邊有六個空格   </code>

<code>#字典 </code>

<code>person </code><code>=</code> <code>{</code><code>'first'</code><code>: </code><code>'Jean-Luc'</code><code>, </code><code>'last'</code><code>: </code><code>'Picard'</code><code>}</code>

<code>New    </code><code>'{p[first]} {p[last]}'</code><code>.</code><code>format</code><code>(p</code><code>=</code><code>person)</code>

<code>Output    Jean</code><code>-</code><code>Luc Picard</code>

<code>#清單</code>

<code>data </code><code>=</code> <code>[</code><code>4</code><code>, </code><code>8</code><code>, </code><code>15</code><code>, </code><code>16</code><code>, </code><code>23</code><code>, </code><code>42</code><code>]</code>

<code>New    </code><code>'{d[4]} {d[5]}'</code><code>.</code><code>format</code><code>(d</code><code>=</code><code>data)</code>

<code>Output    </code><code>23</code> <code>42</code>

<code>#Accessing arguments by position:</code>

<code>&gt;&gt;&gt; </code><code>'{0}, {1}, {2}'</code><code>.</code><code>format</code><code>(</code><code>'a'</code><code>, </code><code>'b'</code><code>, </code><code>'c'</code><code>)</code>

<code>'a, b, c'</code>

<code>&gt;&gt;&gt; </code><code>'{}, {}, {}'</code><code>.</code><code>format</code><code>(</code><code>'a'</code><code>, </code><code>'b'</code><code>, </code><code>'c'</code><code>)  </code><code># 3.1+ only</code>

<code>&gt;&gt;&gt; </code><code>'{2}, {1}, {0}'</code><code>.</code><code>format</code><code>(</code><code>'a'</code><code>, </code><code>'b'</code><code>, </code><code>'c'</code><code>)</code>

<code>'c, b, a'</code>

<code>&gt;&gt;&gt; </code><code>'{2}, {1}, {0}'</code><code>.</code><code>format</code><code>(</code><code>*</code><code>'abc'</code><code>)      </code><code># unpacking argument sequence</code>

<code>&gt;&gt;&gt; </code><code>'{0}{1}{0}'</code><code>.</code><code>format</code><code>(</code><code>'abra'</code><code>, </code><code>'cad'</code><code>)   </code><code># arguments' indices can be repeated</code>

<code>'abracadabra'</code>  

<code>#Accessing arguments by name:</code>

<code>&gt;&gt;&gt; </code><code>'Coordinates: {latitude}, {longitude}'</code><code>.</code><code>format</code><code>(latitude</code><code>=</code><code>'37.24N'</code><code>, longitude</code><code>=</code><code>'-115.81W'</code><code>)</code>

<code>'Coordinates: 37.24N, -115.81W'</code>

<code>&gt;&gt;&gt; coord </code><code>=</code> <code>{</code><code>'latitude'</code><code>: </code><code>'37.24N'</code><code>, </code><code>'longitude'</code><code>: </code><code>'-115.81W'</code><code>}</code>

<code>&gt;&gt;&gt; </code><code>'Coordinates: {latitude}, {longitude}'</code><code>.</code><code>format</code><code>(</code><code>*</code><code>*</code><code>coord)</code>

本文轉自 xoyabc 51CTO部落格,原文連結:http://blog.51cto.com/xoyabc/1983364,如需轉載請自行聯系原作者