2017-03-04 1 views
-1

Wenn ich t=[[False]*2]*2 eingeben, bekomme ich die Liste [[False, False], [False, False]]. Aber wenn ich t[0][0] = True, t[1][0] gebe, ändert sich auch zu True, mich mit [[True, False], [True, False]] verlassen. Ich möchte nur [[True, False], [False, False]]. Als zweite Option könnte ich t=[[False]*2, [False]*2] zuweisen und dann ändern t[0][0] = True bekommt mich, was ich will ([[True, False], [False, False]]), aber meine echte Liste ist viel größer als das, also würde ich lieber nicht Option 2. Ich dachte, dass dies ein ähnliches Problem war zum Klonen mit Listen im Vergleich zu kopieren, also habe ich versucht: ([[False]*2])*2Python: Wie repliziere ich eine replizierte Liste ohne Klonen

([False]*2)*2

[[False]*2][:]*2

t = [False]*2 t = t*2

list([False]*2)*2

list([[False]*2])*2

[list([False]*2)]*2. Keine von diesen hat funktioniert. Gibt es eine Möglichkeit, dies zu tun, ohne ein Paket zu importieren?

Antwort

0

Wenn Sie Ihre Listen mit dem Listenverständnis erstellen, zeigt jedes Listenobjekt auf eine eindeutige Adresse und nicht auf die gleiche Referenz.

t = [[False for x in range(2)] for y in range(2)] 
t[0][0] = True 
t # [[True, False], [False, False]] 
+0

Natürlich! Ich habe überall auf der Liste Verständnis verwendet, aber ich habe vergessen, es hier zu verwenden. Übrigens, 'xrange' funktioniert in Python 3 nicht (es ist nur' range'). Gibt es wirklich keine Möglichkeit, dies ohne Listenverständnis zu tun? –

+0

@ P.Gordy Es gibt auch 'itertools.repeat (val, numberoftimes)', jedoch wird das Listenverständnis schneller sein. Und wenn Sie die "Wiederholung" verschachteln, wird es wirklich schnell hässlich. – MSeifert

+1

Das '[False für x im Bereich (2)]' kann eigentlich nur '[False] * 2' sein. Nur die zweite muss das 'for y in range (2)' haben. –

Verwandte Themen