对于以下代码,即使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
仍然保留逆转。我不确定这里发生了什么
任何帮助表示赞赏!
答案 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