Python递归反转列表报AttributeError错误原因咨询
为什么代码1抛出AttributeError而代码2正常运行?
这问题戳中了Python里列表方法和字符串操作一个很容易踩的坑,核心区别在于列表的append()方法和字符串的+操作的返回值完全不同,咱们一步步拆解:
先看代码2为什么能正常工作
字符串在Python里是不可变类型,reverse(s[1:]) + s[0]这个操作会:
- 先递归调用
reverse(s[1:])拿到一个反转后的子字符串 - 把这个子字符串和当前的
s[0]字符拼接,生成一个新的字符串并返回
每一层递归都能拿到有效的字符串结果,所以整个递归链条能正常传递,最终返回完整的反转字符串。
再看代码1的问题所在
列表的append()方法是原地修改列表——它会直接把元素添加到原列表里,但这个方法的返回值是None!
当你写return reverse(s[1:]).append(s[0])时,执行顺序是:
- 调用
reverse(s[1:])得到一个列表(比如递归到最后一层会返回['o']这样的列表) - 对这个列表调用
append(s[0]),确实会把字符添加进去,但append返回的是None - 所以这一层递归最终返回的是
None
当递归回到上一层时,代码会尝试对None调用append,自然就抛出AttributeError: 'NoneType' object has no attribute 'append'了。
修复代码1的两种方式
方式1:先接收递归结果,append后返回原列表
def reverse(s): if len(s) == 1: return list(s) else: result = reverse(s[1:]) result.append(s[0]) return result
这里我们先拿到递归返回的列表,append修改后返回这个列表本身,而不是append的返回值。
方式2:用列表拼接替代append(和字符串逻辑对齐)
def reverse(s): if len(s) == 1: return list(s) else: return reverse(s[1:]) + [s[0]]
列表的+操作和字符串一样,会返回一个新的列表,这样每一层递归都能返回有效的列表,就不会出现None的问题了。
内容的提问来源于stack exchange,提问作者pks
相关产品推荐
相关产品推荐

