2010-03-29 9 views
19

Hallo Ich möchte eine 2D-Liste kopieren, so dass, wenn ich 1 Liste ändern, die andere nicht geändert wird.Kopieren von 2D-Listen in Python

für 1 D-Liste, ich dies nur tun:

a = [1,2] 
b = a[:] 

Und jetzt, wenn ich b ändern, ein modifiziertes nicht.

Aber das funktioniert nicht für 2D-Liste:

a = [[1,2],[3,4]] 
b = a[:] 

Wenn ich b ändern, wird ein ebenfalls geändert.

Wie behebe ich das?

+3

Eine ganze Menge Zeit, wenn Benutzerlisten verschachtelt Menschen und müssen sie auf diese Weise kopieren, sie wollen wirklich "numpy" benutzen. –

Antwort

34

Für eine allgemeinere Lösung, die unabhängig von der Anzahl der Dimensionen arbeitet, verwendet copy.deepcopy():

import copy 
b = copy.deepcopy(a) 
+0

Obwohl ich in den meisten Fällen wahrscheinlich '' sagen würde kopiere den Import decopy, da ein Namenskonflikt unwahrscheinlich ist, und es sieht schöner aus. ;) – Amber

+1

@Dav, du machst einen gültigen Punkt. Ich bevorzuge es, Module immer zu importieren, um Namenskonflikte zu vermeiden, anstatt Funktionen von Fall zu Fall zu bearbeiten. :) –

+0

Beachten Sie, dass dies auch die tatsächlichen Elemente in den Listen deepcopy wird. – FogleBird

35
b = [x[:] for x in a] 
+4

+1 seit angemessen. Ich persönlich mag die Vermeidung von copy/decopy (sehr selten hatte sie im wirklichen Leben einen gültigen Anwendungsfall; das gleiche kann für eine Liste mit mehr als 2 Dimensionen gesagt werden) – ChristopheD

Verwandte Themen