1

我最近开始使用 Python 2.7 进行编码。我是分子生物学家。我正在编写一个脚本,其中涉及创建这样的列表:

mylist = [[0, 4, 6, 1], 102]

这些列表通过向 mylist[0] 添加一个项目并将一个值与 mylist[1] 相加来递增。

为此,我使用以下代码:

def addres(oldpep, res):
    return [oldpep[0] + res[0], oldpep[1] + res[1]]

哪个效果很好。由于 mylist[0] 可能会变得有点长,而且我有数百万个这样的列表需要处理,我认为使用 append 或 extend 可能会使我的代码更快,所以我尝试了:

def addres(pep, res):
    pep[0].extend(res[0])
    pep[1] += res[1]
    return pep

在我看来,这应该给出相同的结果。当我在任意列表上尝试时,它确实给出了相同的结果。但是当我将它提供给数百万个列表时,它给了我一个非常不同的结果。那么……这两者有什么区别?脚本的所有其余部分完全相同。谢谢!罗伯托

4

2 回答 2

3

不同之处在于第二个版本addres 修改了你传入的列表,pep第一个版本返回一个新的。

>>> mylist = [[0, 4, 6, 1], 102]
>>> list2 = [[3, 1, 2], 205]
>>> addres(mylist, list2)
[[0, 4, 6, 1, 3, 1, 2], 307]
>>> mylist
[[0, 4, 6, 1, 3, 1, 2], 307]

如果您不需要修改原始列表,我认为您不会真正获得addres比您编写的第一个更快的 Python 实现。但是,您可能能够处理修改,或者如果这是您面临的问题,则可以提出一种稍微不同的方法来加速您的代码。

于 2013-11-06T21:30:56.080 回答
0

列表是python中通过引用传递的对象。

一个=列表()

这并不意味着 a 是列表,而是 a 指向刚刚创建的列表。

在第一个示例中,您正在使用列表元素并创建一个新列表,另一个对象,而在第二个示例中,您正在修改列表内容本身。

于 2013-11-06T21:32:16.757 回答