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

2024-04-25 05:09:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图传递一个参数给一个函数buggy\u 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输入也在反转。有人能解释一下原因吗。你知道吗


Tags: 函数testinput参数return过程def原因
1条回答
网友
1楼 · 发布于 2024-04-25 05:09:51

试试这个(但请看下面猜测的更好、更通用的版本):

#! /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()

在我的python2.7.11上,它没有产生好的输出。我更改了一些名称只是为了更改,我不建议真正命名函数ex_buggy_reverse;-)

代码中有几个问题:

  1. 不要为关键字(或内置变量或标准模块中经常使用的函数,如果可能的话)的变量使用名称,因为这几乎总是在您至少需要它的时候咬到您。input是这里的意思。

  2. 反向不复制,所以为什么要在函数中执行它。你最好写在下面这张单子上。

  3. 尝试与PEP8兼容(这里是list literal中逗号后面的空格)。

重写reverse_proxy函数的示例(替换buggy_reverse(...)):

def reverse_proxy(an_iterable):
    return reversed(an_iterable)

从python文档中的reversed():“返回一个反向迭代器。seq必须是一个对象,该对象具有反向的()方法或支持序列协议(从0开始的整数参数的len()方法和getitem()方法)。”

因此,如果您想将iterable转换为一个列表,我建议您在名称中说明这个目的,并且请记住,在本地定义的对象上调用reverse方法(将列表中的元素反转到位)并返回该对象/引用(而不是eg)看起来很笨拙

def as_reverse_list(an_iterable):
    return list(reversed(an_iterable))

这里有一个带焦点的问题/答案页面: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()

快乐的黑客!你知道吗

相关问题 更多 >