意外的输入反向导致AssertionError #python

时间:2016-06-16 06:26:13

标签: python list reverse

我试图将参数传递给函数buggy_reverse。

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输入的过程中也正在逆转。有人可以解释一下原因。

1 个答案:

答案 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的几个问题:

  1. 不要将名称用于作为关键字的变量(或者如果可能的话,在标准模块中使用内置函数或经常使用的函数),因为这几乎总是会在你期望的时候咬你。 input就在这里。

  2. 反向不进行复制,为什么要在函数中进行复制。您可能最好在此处列出此项目列表。

  3. 尝试符合PEP8(此处为列表文字中逗号后面的空格。

  4. 重写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和快乐的黑客攻击!