В чем разница между этими двумя кодами?

Я недавно начал писать в 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 указывает на только что созданный список.

В первом примере вы используете элемент списка и создаете новый список, другой объект, в то время как во втором вы сами изменяете содержимое списка.

Другие вопросы по тегам