2016-07-24 22 views
0

Ich habe zwei Liste, die ich zu einer einzigen Liste zusammenfassen. Später möchte ich eine Kopie dieser Liste machen, damit ich diese zweite Liste manipulieren kann, ohne meine erste Liste zu beeinflussen. Mein Verständnis ist, wenn Sie dies verwenden [:] sollte die Verknüpfung der Liste aufheben und eine zweite Kopie der Liste in einem unabhängigen Speicherort erstellen. Mein Problem ist, dass ich die Arbeit für dieses Szenario nicht sehe. Ich habe auch versucht, list-Befehl zu verwenden, aber das Ergebnis war das gleiche.Python Liste der Liste Verknüpfung des Objekts

a = ['a','b','c'] 
b = ['1','2','3'] 
c = [a[:],b[:]] # list of list 

d = c[:] # want to create copy of the list of list so I can remove last item 
for item in d: 
    del item[-1] 

# this is what I am getting returned. 
In [286]: c 
Out[286]: 
[['a', 'b'], ['1', '2']] 

In [287]: d 
Out[287]: 
[['a', 'b'], ['1', '2']] 
+0

Wollen Sie es '[1, 2], [3, 4]' auf '[1, 2, 3, 4]' oder 'konvertieren [[1, 2], [3, 4]] ' –

+0

Mögliches Duplikat von [Tiefe eine Liste in Python kopieren] (http://stackoverflow.com/questions/17873384/deep-copy-a-list-in-python) –

+0

eigentlich war meine Hoffnung, 3 Elemente in Liste c zu haben und nur 2 Elemente in Liste d – bytes1234

Antwort

2

[:] macht nur eine flache Kopie. Das heißt, es kopiert die Liste selbst, aber nicht die Elemente in der Liste. Sie sollten copy.deepcopy verwenden.

import copy 
d = copy.deepcopy(c) 

Stellen Sie sich eine Liste als Zeiger auf Objekte vor. Jetzt ist Ihre Variable ein Zeiger auf die Liste. Was [:] tut ist eine völlig neue Liste mit den gleichen genauen Zeigern erstellen. copy.deepcopy kopiert alle Attribute/Referenzen innerhalb Ihres Objekts und die Attribute/Referenzen innerhalb dieser Attribute/Referenzen.

+0

Dies scheint zu funktionieren. – bytes1234

+0

Netter Job CP. Ich mag deinen Stil, Einsicht und Kürze. Ich wünschte, ich hätte das! – Drew

+0

@Drew vielen Dank, wirklich zu schätzen wissen! –

0

Sie sind in Python auf das Konzept der seichten und tiefen Kopie gestoßen.

Der Slice-Operator funktioniert gut, wenn die Listenstrukturen keine Unterlisten enthalten.

list1 = ['a', 'b', 'c', 'd'] 
list2 = list1[:] 
list2[1] = 'x' 
print list1 
['a', 'b', 'c', 'd'] 
print list2 
['a', 'x', 'c', 'd'] 

Dies scheint gut zu funktionieren, aber sobald eine Liste von Unterlisten enthält, haben wir die gleiche Schwierigkeit, das heißt nur die Teil-Listen Zeiger zu.

list1 = ['a', 'b', ['ab', 'ba']] 
list2 = list1[:] 

Wenn Sie einen neuen Wert auf ein Element einer der beiden Listen zugeordnet werden, wird es keine Nebenwirkungen, aber wenn Sie eines der Elemente der Teilliste ändern, wird das gleiche Problem auftreten.

Dies ist ähnlich wie Sie den Inhalt der Unterliste a und b in c ändern.

Um dieses Problem zu vermeiden, müssen Sie mit deepcopy eine Deepcopy der Listen erstellen.

Dies kann wie folgt geschehen:

from copy import deepcopy 

list1 = ['a', 'b', ['ab', 'ba']] 
list2 = deepcopy(list1) 
Verwandte Themen