2017-04-21 5 views
1

So stolpere ich immer von oben, was scheint, wie ein Zeiger in C dh Zum Beispiel verhält eine Variable in Python zu sein:Reuse Variablennamen an verschiedenen Daten Punkt

foo = ['item1', 'item2', 'item3'] 

jetzt, wenn ich diese Liste zuzuweisen der Wert eines Wörterbuchs, dessen Schlüssel 'bar':

my_dict['bar'] = foo 

alles ist in Ordnung, aber wenn ich jetzt tun:

foo.clear() 

dann my_dic t ['bar'] ist jetzt leer, was bedeutet, dass foo und my_dict ['bar'] nur zwei verschiedene Namen sind, die auf die gleichen Daten zeigen. Wie kann ich das umgehen, so dass ich foo in my_dict ['bar'] werfen und dann foo für den nächsten Gegenstand im Wörterbuch wiederverwenden kann?

Wie kann ich das umgehen, damit ich "foo" wiederverwenden kann?

Antwort

4

Sie haben Recht, dass es wie ein Zeiger ist. Sammlungen von Daten wie Listen, Wörterbücher, Objekte usw. werden als Referenz übergeben. Wenn Sie also mydict["bar"] = foo setzen, haben Sie es gleich der Referenz von foo gesetzt.

Um dies zu umgehen, müssten Sie eine Kopie von foo machen. Sie sollten mit einer flachen Kopie

mydict["bar"] = foo[:]

ich diesen Fall die Scheibe Betreiber eine neue Liste aller Elemente in foo, erhalten, indem mit einem neuen Referenzwert schaffen. Sie könnten auch das copy Python-Modul in Erwägung ziehen, das einen ähnlichen Effekt hätte, aber tiefe Kopiervorgänge unterstützt. d.h. es erzeugt Kopien des Objekts selbst und aller darin enthaltenen Objekte.

Bitte lesen Sie auch Jasonharper's Kommentar dazu. Wenn Sie keine Kopie der Elemente benötigen, ist es effizienter, einfach eine neue leere Liste zu erstellen.

+1

Alternativ können Sie 'foo = []' anstelle von 'foo.clear()' verwenden, um eine neue Liste zu erstellen. – jasonharper

+0

Vielen Dank, ich dachte, es wäre ein einfacher Weg, dies zu tun. Bei dieser Gelegenheit ist es perfekt, denn was ich suchte, war in der Tat eine oberflächliche Kopie. – iFunction