def buggy_reverse(input):
m = input
m.reverse()
return m
def test_buggy_reverse():
assert [3,2,1] == buggy_reverse([1,2,3])
assert [] == buggy_reverse([])
input = ["a", "b", "c"]
assert ["c", "b", "a"] == buggy_reverse(input)
assert ["a", "b", "c"] == input
我已将输入分配给m并反转m。但在逆转m输入的过程中也正在逆转。有人可以解释一下原因。
答案 0 :(得分:0)
试试这个(但请参阅下面的猜测更好,更通用的版本):
#! /usr/bin/env python
def ex_buggy_reverse(in_list):
m = in_list[:]
m.reverse()
return m
def test_ex_buggy_reverse():
assert [3, 2, 1] == ex_buggy_reverse([1, 2, 3])
assert [] == ex_buggy_reverse([])
a_list = ["a", "b", "c"]
assert ["c", "b", "a"] == ex_buggy_reverse(a_list)
assert ["a", "b", "c"] == a_list
test_ex_buggy_reverse()
在我的python 2.7.11上,它没有产生好的输出。我改变了一些名字只是为了改变,我不建议真正命名函数ex_buggy_reverse
; - )
您的代码中有IMO的几个问题:
不要将名称用于作为关键字的变量(或者如果可能的话,在标准模块中使用内置函数或经常使用的函数),因为这几乎总是会在你期望的时候咬你。 input
就在这里。
反向不进行复制,为什么要在函数中进行复制。您可能最好在此处列出此项目列表。
尝试符合PEP8(此处为列表文字中逗号后面的空格。
重写reverse_proxy
功能的示例(替换buggy_reverse(...)
:
def reverse_proxy(an_iterable):
return reversed(an_iterable)
来自reverse()的python文档:“返回一个反向迭代器.seq必须是一个具有反向()方法的对象,或者支持序列协议( len ()方法和 getitem ()方法,整数参数从0开始。“
因此,如果你想将iterable转换为一个列表,我建议在名称中说明这个目的,并记住在本地定义的对象上调用reverse方法看起来很笨(这会反转列表的元素到位)并返回该对象/参考而不是例如。
def as_reverse_list(an_iterable):
return list(reversed(an_iterable))
在焦点列表中列出了一个可靠的问题/ anser页面:How can I reverse a list in python?。
这里承诺的猜测增强版和扩展版:
#! /usr/bin/env python
def as_reverse_list(an_iterable):
return list(reversed(an_iterable))
def test_as_reverse_list():
assert [3, 2, 1] == as_reverse_list([1, 2, 3])
assert [] == as_reverse_list([])
a_list = ["a", "b", "c"]
assert ["c", "b", "a"] == as_reverse_list(a_list)
assert ["a", "b", "c"] == a_list
a_tuple = ("a", "b", "c")
assert ["c", "b", "a"] == as_reverse_list(a_tuple)
assert ["a", "b", "c"] == a_list
test_as_reverse_list()
HTH和快乐的黑客攻击!