So lassen Sie die Methode list append () die neue Liste zurückgeben

82

Ich möchte so etwas machen:

myList = [10,20,30]
yourList = myList.append (40)

Leider gibt das Anhängen der Liste die geänderte Liste nicht zurück.

Wie kann ich die appendRückgabe der neuen Liste zulassen ?

Wilk
quelle

Antworten:

139

Verwenden Sie stattdessen nicht Anhängen, sondern Verketten:

yourList = myList + [40]

Dies gibt eine neue Liste zurück. myListwird nicht betroffen sein. Wenn Sie benötigen , myListbetroffen und entweder verwenden .append()sowieso, dann zuweisen yourListgetrennt von (eine Kopie)myList .

Martijn Pieters
quelle
2
Was wäre der Grund für die append()Rückkehr Noneanstelle derselben Liste gewesen? Welches Zen-Prinzip würde es verletzen?
Ciprian Tomoiagă
3
@CiprianTomoiaga: siehe en.wikipedia.org/wiki/Command%E2%80%93query_separation ; list.appendist ein Befehl, keine Abfrage.
Martijn Pieters
2
@CiprianTomoiaga: Siehe auch diese E-Mail von der Python BDFL .
Martijn Pieters
2
@Dieblitzen: Richtig, also verwendet OCaml verknüpfte Listen und verbindet diese. Python-Listen sind nicht unveränderlich, daher können Sie dies mit diesen nicht tun, und außerdem kann alles andere veränderbar sein . Während eine OCaml-Liste unveränderliche Objekte enthält, kann der Inhalt unveränderlicher Objekte wie Tupel in Python weiterhin veränderbar sein, sodass Sie den Inhalt beim Verketten nicht mit anderen Containern teilen können.
Martijn Pieters
2
@Dieblitzen: Aus diesem Grund müssen Sie in Python eine flache Kopie erstellen und die O (N) -Zeit bezahlen, damit eine Verkettungsoperation gültig ist. Ich hätte expliziter sein sollen, sorry.
Martijn Pieters
21

In Python 3 können Sie eine neue Liste erstellen, indem Sie die alte entpacken und ein neues Element hinzufügen:

a = [1,2,3]
b = [*a,4] # b = [1,2,3,4] 

wenn Sie das tun:

myList + [40]

Sie haben tatsächlich 3 Listen.

Damian Paszkowski
quelle
1
Und es ist ein bisschen schneller
Aerobiomat
6

list.appendist eingebaut und kann daher nicht geändert werden. Aber wenn Sie bereit sind, etwas anderes als zu verwenden append, können Sie versuchen +:

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]

Der Nachteil dabei ist natürlich, dass eine neue Liste erstellt wird, die viel länger dauert als append

Hoffe das hilft

inspectorG4dget
quelle
Aber das eingebaute kann in Unterklassen unterteilt werden und dann geht alles :)
Marcin Wyszynski
@MarcinWyszynski: Ja, aber sie können nur innerhalb der Unterklasse geändert werden. Die eingebaute Methode eines eingebauten Objekts / einer eingebauten Klasse kann selten überschrieben werden, wenn überhaupt
inspectorG4dget
3
Für Ihre eigene Gesundheit und die Ihrer Kollegen sollten Sie das niemals tun :)
Marcin Wyszynski
2

Sie können den integrierten Listentyp in Unterklassen unterteilen und die Methode "Anhängen" neu definieren. Oder noch besser, erstellen Sie eine neue, die das tut, was Sie wollen. Unten finden Sie den Code für eine neu definierte Methode zum Anhängen.

#!/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()

Hoffentlich hilft das.

Marcin Wyszynski
quelle
2

Versuchen Sie es mit itertools.chain(myList, [40]). Dadurch wird ein Generator als Sequenz zurückgegeben, anstatt eine neue Liste zuzuweisen. Im Wesentlichen werden dadurch alle Elemente vom ersten iterierbaren Element bis zur Erschöpfung zurückgegeben und dann zum nächsten iterierbaren Element weitergeleitet, bis alle iterierbaren Elemente erschöpft sind.

jsears
quelle
1

Nur um die Antwort von Storstamp zu erweitern

Sie müssen nur myList.append (40) ausführen.

Es wird an die ursprüngliche Liste angehängt. Jetzt können Sie die Variable zurückgeben, die die ursprüngliche Liste enthält.

Wenn Sie mit sehr großen Listen arbeiten, ist dies der richtige Weg.

ajayinvictus10
quelle
-4

Sie müssen nur myList.append (40) ausführen.

Es wird an die ursprüngliche Liste angehängt und keine neue Liste zurückgegeben.

Storstamp
quelle