2017-02-20 4 views
2

Ich verstehe nicht, warum das Folgende passiert. Python 2.7.2Python: Alle Elemente einer Struktur ändern sich, wenn man tut

parinfo = [{'limited':[0,0], 'limits':[0.,0.]}] * 3 
parinfo[2]['limited'][0] = 1 
parinfo[2]['limited'][0] = 1 

parinfo 
[{'limited': [1, 0], 'limits': [0.0, 0.0]}, 
{'limited': [1, 0], 'limits': [0.0, 0.0]}, 
{'limited': [1, 0], 'limits': [0.0, 0.0]}] 

Antwort

2
parinfo = [{'limited':[0,0], 'limits':[0.,0.]}] * 3 

über die Linie, anstelle von 3 verschiedenen Dictionary-Objekte zu machen, schafft es ein; Alle Elemente in der Liste verweisen auf dasselbe Wörterbuch.

Sie benötigen diese Art und Weise zu tun, 3 getrennt Wörterbücher zu erstellen:

parinfo = [{'limited':[0,0], 'limits':[0.,0.]} for i in range(3)] 
+0

@StevenRumbalski, Vielen Dank für den Kommentar. Ich habe es entsprechend aktualisiert. – falsetru

-1
parinfo = [{'limited':[0,0], 'limits':[0.,0.]}] * 3 

Dieser Code erstellt eine flache Kopie statt tiefer Kopie.

+0

Nein, nicht einmal eine flache Kopie. Nur 3 Referenzen auf das gleiche Wörterbuchobjekt. In [link] (https://docs.python.org/2/library/copy.html) finden Sie eine Erläuterung zu flachen Kopien (und auch zu tiefen Kopien). – Elmex80s

2

Ihre Frage kann in ein paar Teile unterteilt werden.

Zuerst multiplizieren Sie eine Liste, die die magische Methode __mul __() nutzt.

s .__ mul __ (n) -> Ergebnisse in s * n - wiederholte Verkettung.

>>> a = [1,2,3] 
>>> a * 3 
[1, 2, 3, 1, 2, 3, 1, 2, 3] 

Darüber hinaus wird eine Liste der Listen zu initialisieren versuchen, in einer Liste führt drei innere Liste verweisen, das ist wahrscheinlich nicht das, was Sie wollen.

>>> a = [[]] 
>>> a * 3 
[[], [], []] 

Zweitens haben Sie ein Schlüssel-Wert-Paar erzeugt, wenn der Wert eine Liste ist.

„begrenzt“ ist der Schlüssel zu einer Liste mit drei Elementen [1,2,3]

>>> dicty = {'limited': [1, 2, 3]} 
>>> dicty['limited'] 
[1, 2, 3] 

Drittens werden Sie im Wesentlichen das 0-te Element in der Liste zu aktualisieren.

>>> dicty['l'][0] = 100 
>>> dicty 
{'l': [100, 2, 3]} 
Verwandte Themen