<p>你的代码实际上有几个错误。<br/>
让我们详细分析一下</p>
<p>主要问题在于:</p>
<pre><code>list1 = [s]
new_list = [x for x in list1 if x.isdigit()]
</code></pre>
<p>你应该先直接在字符串上循环</p>
^{pr2}$
<p>当您创建一个新列表时,<code>x for x in list1</code>中的变量<code>x</code>将作为列表的元素发生。因此,在您的例子中,列表只有一个元素,它恰好是整个字符串(因为您将列表定义为<code>[s]</code>)。由于整个字符串不是数字,<code>new_list</code>将是一个空列表。<br/>
这就是为什么你得到0作为回报。在</p>
<p>但是,如果直接遍历字符串,<code>x</code>将作为字符串中的每个字母发生,然后可以检查<code>x</code>是否为数字。在</p>
<p>同样重要的是要强调<code>new_list[e]</code>将引发{<cd8>}。您应该只对<code>e</code>进行更正。<code>for e in new_list</code>的sintax使局部变量<code>e</code>假定列表中的每个值都是<strong>的,因此不必通过索引获取值:可以直接使用<code>e</code>。<br/>
最后,为了对新列表中的值求和,这些值应该是整数(<code>int</code>),而不是字符串(<code>str</code>),因此在求和之前,必须将值强制转换为<code>int</code>(或者,您可以在列表理解过程中将每个元素强制转换为<code>int</code>,方法是使用<code>int(x) for x in s if x.isdigit()</code>,而不是{<cd18>})。另外,为了检查输入是否是字符串,最好使用<code>isinstance(s, basestring)</code>,如果使用python2,最好使用<code>isinstance(s, str)</code>,如果使用python3。在</p>
<p>所以整个代码应该是这样的:</p>
<pre><code>def sumDigits(s):
if isinstance(s, basestring):
total = 0
new_list = [x for x in s if x.isdigit()]
for e in new_list:
total += int(e)
return total
else:
print "What you entered is not a string."
</code></pre>