<p>问题是,当您在一个列表上使用<code>+=</code>时,它期望操作符另一端的对象是一个列表或其他某种iterable。所以你可以这样做:</p>
<pre><code>>>> def encode():
... result2 = []
... print result
... for x in result:
... result2 += [str(x)]
... print result2
...
>>> result = [123, 456, 789]
>>> encode()
[123, 456, 789]
['123', '456', '789']
</code></pre>
<p>但是当你这样做的时候:</p>
<pre><code>result2 += str(x)
</code></pre>
<p>Python假设您打算将<code>str(x)</code>的结果视为iterable,因此在扩展<code>result2</code>之前,它有效地*将字符串转换为字符列表,如下例所示:</p>
<pre><code>>>> [list(str(x)) for x in result]
[['1', '2', '3'], ['4', '5', '6'], ['7', '8', '9']]
</code></pre>
<p>正如<a href="https://stackoverflow.com/questions/6950605/python-list-of-numbers-converted-to-string-incorrectly/6950612#6950612">NullUserException</a>所建议的,转换列表中的项的快速方法是使用列表理解。在这种情况下,只需删除上面的<code>list</code>调用。</p>
<hr/>
<p>*准确地说,它将<code>str(x)</code>的结果转换为迭代器(例如通过调用<code>iter()</code>——或者,正如eryksun所指出的,通过调用相应的C API函数<a href="http://docs.python.org/c-api/object.html#PyObject_GetIter" rel="nofollow noreferrer">PyObject_GetIter</a>,当然这只适用于cpython)。由于对字符串的迭代实际上是对字符串中单个字符的迭代,因此每个字符都将分别添加到列表中。</p>