我最近开始使用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
在我看来应该给出相同的结果。当我在任意列表上尝试时, 给出相同的结果。但是当我将它提供给数百万个列表时,它给了我一个非常不同的结果。那么......两者之间有什么区别?脚本的其余部分完全相同。 谢谢! 罗伯特
答案 0 :(得分: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]
如果您不需要修改原始列表,我认为您不会真正获得比您编写的第一个更快的Python addres
实现。但是,您可能能够处理修改,或者提出一种不同的方法来加速代码,如果这是您面临的问题。
答案 1 :(得分:0)
List是python中通过引用传递的对象。
α=清单()
这并不意味着a是列表,而是指向刚刚创建的列表。
在第一个示例中,您正在使用list元素并创建一个新列表,另一个对象是在第二个对象中,您正在修改列表内容本身。