2016-03-30 13 views
0

Ich versuche zu verstehen, warum diese zwei Beispiele mir verschiedene Ausgaben geben.Warum bekomme ich unterschiedliche Ausgaben für den (scheinbar) gleichen Code?

Example1:

list1 = [1,2,3,4,5] 
list2 = [] 
for l in list1: 
    list2.append(l) 
print list2 

#[1, 2, 3, 4, 5] 

Example2:

list1 = [1,2,3,4,5] 
list2 = [] 
list2.append(l for l in list1) 
print list2 

#[<generator object <genexpr> at 0x10379ecd0>] 

Ich habe versucht, die Liste setzen() oder Tupel() nach dem Anfügen in dem zweiten Beispiel, aber es gibt mir ein einziges Element in die neue Liste im Gegensatz zu 5 verschiedenen.

Wäre es möglich, dieselbe Ausgabe von Beispiel1 mit nur einer Zeile für die for-Schleife zu erhalten?

Ich würde wirklich jede Hilfe zu schätzen wissen!

Antwort

4

Sie benötigen extend statt append für das zweite Beispiel

list1 = [1,2,3,4,5] 
list2 = [] 
list2.extend(l for l in list1) # or just list2.extend(list1) 
print list2 

Wenn alles, was Sie tun wollen Exemplar list1 dann

list2 = list1[:] 

oder

list2 = list(list1) 

wird es tun

0

Sie möchten im zweiten Beispiel nicht anhängen. Stattdessen wollen Sie

list2 = [l for l in list1] 

Es gibt einfachere Wege, um eine Liste zu kopieren, aber das ist derjenige, der am ehesten entspricht, was Sie gehen in Beispiel 2

0

Wenn Sie nicht die verschachtelte gefällt Liste, dann können Sie einfach verwenden:

list1 = [1,2,3,4,5] 
list2 = [] 
[list2.append(l) for l in list1] 
3

(l for l in list1) ein generator expression ist. Es gibt explizit einen Generator zurück, der im Wesentlichen ein speichersparender Iterator ist (denke an eine Liste, aber mit jedem Element, das im laufenden Betrieb zurückgegeben wird, anstatt alles im Speicher zu speichern). Der Schlüssel zur Realisierung ist ein Generatorausdruck, der darauf hinweist, dass der Ausdruck von ( und ) umgeben ist.

In list2.append(l for l in list1) haben Sie einen einzelnen Generator an die leere Liste angehängt. Sie können immer noch alle gewünschten Elemente erhalten, indem Sie for element in list2[0] tun, aber es ist nicht das Gleiche.

jedoch dabei

for l in list1: 
    list2.append(l) 

keine solchen Generator Ausdrücke vorkommen. Bei jeder Iteration - jeder Durchlauf der Schleife - l, ein Element, wird an das Ende angehängt. Deshalb funktioniert das so, wie du denkst.


Wenn Sie Ihren list2 mit etwas ähnlich dem Generator Ausdruck erhalten möchten, wollen Sie eine list comprehension stattdessen verwenden:

list2 = [l for l in list1] 

Beachten Sie, dass der Unterschied zwischen der Struktur einer Liste Verständnis und eine Generator Ausdruck ist einfach das Vorhandensein von eckigen Klammern [, ] anstelle von Klammern.

Verwandte Themen