Chcę zrobić coś takiego:
myList = [10, 20, 30]
yourList = myList.append(40)
Niestety dołączenie listy nie zwraca zmodyfikowanej listy.
Jak więc mogę zezwolić append
na zwrócenie nowej listy?
Nie używaj zamiast tego dołączania, ale konkatenacji:
yourList = myList + [40]
To zwraca nową listę; myList
nie ulegnie zmianie. Jeśli musisz mieć myList
wpływ także użyć .append()
w każdym razie, a następnie przypisać yourList
oddzielnie (kopia) myList
.
append()
powrotuNone
zamiast tej samej listy? Którą zasadę zen by to naruszyło?list.append
jest poleceniem, a nie zapytaniem.W Pythonie 3 możesz stworzyć nową listę, rozpakowując starą i dodając nowy element:
a = [1,2,3] b = [*a,4] # b = [1,2,3,4]
kiedy robisz:
myList + [40]
W rzeczywistości masz 3 listy.
źródło
list.append
jest wbudowany i dlatego nie można go zmienić. Ale jeśli chcesz użyć czegoś innego niżappend
, możesz spróbować+
:In [106]: myList = [10,20,30] In [107]: yourList = myList + [40] In [108]: print myList [10, 20, 30] In [109]: print yourList [10, 20, 30, 40]
Oczywiście wadą jest to, że tworzona jest nowa lista, która zajmuje dużo więcej czasu niż
append
Mam nadzieję że to pomoże
źródło
Możesz podklasować wbudowany typ listy i przedefiniować metodę „dołączania”. Lub jeszcze lepiej, stwórz nowy, który zrobi to, co chcesz. Poniżej znajduje się kod przedefiniowanej metody „append”.
#!/usr/bin/env python class MyList(list): def append(self, element): return MyList(self + [element]) def main(): l = MyList() l1 = l.append(1) l2 = l1.append(2) l3 = l2.append(3) print "Original list: %s, type %s" % (l, l.__class__.__name__) print "List 1: %s, type %s" % (l1, l1.__class__.__name__) print "List 2: %s, type %s" % (l2, l2.__class__.__name__) print "List 3: %s, type %s" % (l3, l3.__class__.__name__) if __name__ == '__main__': main()
Mam nadzieję, że to pomoże.
źródło
Spróbuj użyć
itertools.chain(myList, [40])
. To zwróci generator jako sekwencję zamiast alokacji nowej listy. Zasadniczo zwraca to wszystkie elementy od pierwszej iteracji do jej wyczerpania, a następnie przechodzi do następnej iteracji, aż wszystkie iterowalne zostaną wyczerpane.źródło
Aby rozwinąć odpowiedź Storstampa
Musisz tylko zrobić myList.append (40)
Doda go do oryginalnej listy, teraz możesz zwrócić zmienną zawierającą oryginalną listę.
Jeśli pracujesz z bardzo dużymi listami, to jest właściwy sposób.
źródło
Musisz tylko zrobić myList.append (40)
Doda go do oryginalnej listy, a nie zwróci nowej listy.
źródło