В чем разница между этими двумя кодами?
Я недавно начал писать в 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 или extension может ускорить мой код, поэтому я попытался:
def addres(pep, res):
pep[0].extend(res[0])
pep[1] += res[1]
return pep
Который на мой взгляд должен дать тот же результат. Это дает тот же результат, когда я пытаюсь сделать это в произвольном списке. Но когда я передаю его миллиону списков, это дает мне совсем другой результат. Итак... в чем разница между двумя? Все остальное в сценарии точно такое же. Спасибо! Роберто
2 ответа
Разница в том, что вторая версия 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
чем первый, который вы написали. Однако вы можете иметь дело с модификацией или придумать несколько иной подход для ускорения вашего кода, если с этой проблемой вы столкнулись.
Список - это объекты в Python, которые передаются по ссылке.
а = список ()
Это не означает, что a является списком, но a указывает на только что созданный список.
В первом примере вы используете элемент списка и создаете новый список, другой объект, в то время как во втором вы сами изменяете содержимое списка.