Dieser Weg ist schneller als die verschachtelten Listenverständnisse
[x[:] for x in [[foo] * 10] * 10] # für unveränderliches foo!
Hier sind einige Python3-Zeiten für kleine und große Listen
$python3 -m timeit '[x[:] for x in [[1] * 10] * 10]'
1000000 Schleifen, bester von 3: 1,55 usec pro Schleife
$ python3 -m timeit '[[1 for i in range(10)] for j in range(10)]'
100000 Schleifen, bester von 3: 6,44 usec pro Schleife
$ python3 -m timeit '[x[:] for x in [[1] * 1000] * 1000]'
100 Schleifen, bester von 3: 5,5 msec pro Schleife
$ python3 -m timeit '[[1 for i in range(1000)] for j in range(1000)]'
10 Schleifen, bester von 3: 27 msec pro Schleife
Erklärung:
[[foo]*10]*10
erstellt eine Liste des gleichen Objekts, das 10 Mal wiederholt wird. Du kannst das nicht einfach so verwenden, weil das Ändern eines Elements dieses Element in jeder Zeile ändert!
x[:]
entspricht list(X)
, ist aber etwas effizienter, da es den Namensaufruf umgeht. So oder so erstellt es eine oberflächliche Kopie jeder Zeile, sodass jetzt alle Elemente unabhängig sind.
Alle Elemente sind jedoch das gleiche foo
Objekt, daher, wenn foo
veränderlich ist, kannst du dieses Schema nicht verwenden., musst du
import copy
[[copy.deepcopy(foo) for x in range(10)] for y in range(10)]
oder unter der Annahme einer Klasse (oder Funktion) Foo
, die foo
s zurückgibt
[[Foo() for x in range(10)] for y in range(10)]