递归地将列表反向

时间:2019-07-09 14:34:07

标签: python python-3.x recursion

对于以下代码,即使reverse(s)返回反转的字符串,该字符串本身也不会反转。

s = ["h", "e", "l", "l", "o"]
def reverse(s):
    if len(s) == 0:
        return
    if len(s) == 1:
        return s;
    temp = s[0]
    s = reverse(s[1:])
    s.append(temp)
    return s

print(reverse(s))
print(s)

输出

['o', 'l', 'l', 'e', 'h'] #reverse(s)
['h', 'e', 'l', 'l', 'o'] #s

根据此Python: How do I pass a string by reference?。我了解我需要设置s= reverse(s),然后列表被颠倒并且可以正常使用。

但是为什么s与此相反?

s = ["h", "e", "l", "l", "o"]
def reverse(s, index):
    if index >= len(s) or len(s) == 0:
        return
    reverse(s, index + 1)
    s.insert((len(s) - 1 - index), s.pop())


reverse(s, 0)
print(s)

输出

['o', 'l', 'l', 'e', 'h']

在调试时,我发现对于句柄回到print语句的第一段代码,s成为原始列表,但是对于第二段代码,s仍然保留逆转。我不确定这里发生了什么 任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:3)

第一个方法从不更改原始的s参数,因为它会对其进行切片(使用s[0]s[1:]),从而进行复制(以及当您正在呼叫s.append(temp)s已经是副本)

第二种方法不断更改原始的s参数(使用s.pop()s.insert()

如果要避免第二种方法更改原始参数,请创建一个包装器方法,该方法可以事先创建一个副本(这也避免了显示辅助索引参数)

def reverse(s):
    def internal_reverse(s, index):
        if index >= len(s) or len(s) == 0:
            return
        internal_reverse(s, index + 1)
        s.insert((len(s) - 1 - index), s.pop())

    s2 = s[:] # s[:] is a way to copy the input
    internal_reverse(s2, 0)  
    return s2