Zuordnen Sie die Variable auf den ursprünglichen Wert (definiert vor der Schleife) am Anfang jeder Iteration in der Schleife

In Python verwenden Sie [:] wenn Sie eine Variable zu einem ursprünglichen Wert (definiert vor der Schleife) zu Beginn jeder Iteration neu zuordnen. Das heißt:

 original_1D = ['o', 'o', 'o'] for i in range(0,3): new = original_1D[:] # revert back to 'original_1D' list defined before loop new[i] = 'X' print new 

Produziert eine ausgegebene und erwartete Leistung:

 ['X', 'o', 'o'] ['o', 'X', 'o'] ['o', 'o', 'X'] 

Mein Problem entsteht, wenn die ursprüngliche Liste mehrdimensional ( original_2D ) ist. Beispielsweise:

 original_2D = [['o', 'o', 'o'],['o', 'o', 'o']] for i in range(0,3): new = original_2D[:] # revert back to 'original_2D' list defined before loop new[0][i] = 'X' print new 

Darauf möchte ich folgende Ausgabe:

 # Desired [['X', 'o', 'o'], ['o', 'o', 'o']] [['o', 'X', 'o'], ['o', 'o', 'o']] [['o', 'o', 'X'], ['o', 'o', 'o']] 

aber nein! Ich bekomme das:

 # Actual [['X', 'o', 'o'], ['o', 'o', 'o']] [['X', 'X', 'o'], ['o', 'o', 'o']] [['X', 'X', 'X'], ['o', 'o', 'o']] 

Als ob die original_2D Liste überschrieben wird, welche jede Iteration.

Was mache ich falsch?

3 Solutions collect form web for “Zuordnen Sie die Variable auf den ursprünglichen Wert (definiert vor der Schleife) am Anfang jeder Iteration in der Schleife”

In Python verwenden Sie [:] wenn Sie eine Variable zu einem ursprünglichen Wert neu zuordnen

Nein, Sie verwenden es, um eine Volllängen-Scheibe (dh flache Kopie ) einer Sequenz zu erstellen. Wenn der ursprüngliche Wert eine unveränderliche Sequenz ist (zB Strings und Tupel), ist es unnötig, und wenn der ursprüngliche Wert keine Sequenz ist, wird es nicht funktionieren.

Beachten Sie, dass ich eine flache Kopie oben betont habe – das neue Objekt, das von der Scheibe erstellt wurde, enthält Verweise auf dieselben Objekte wie das Original . Wenn Ihre ursprüngliche Sequenz Verweise auf veränderliche Objekte enthält (wie zB Listen), kann dies ein Problem sein.

Entweder verwenden Sie copy.deepcopy , um eine tiefe (anstatt flache) Kopie zu erstellen:

 from copy import deepcopy new = deepcopy(original2D) 

Oder explizit auch flache Kopien der Unterlisten erstellen, zB mit einem Listenverständnis :

 new = [row[:] for row in original2D] 

Die ehemaligen Skalen leichter zu höheren Dimensionen.

In Pythonlisten werden immer die Objektreferenz übergeben. Also, wenn Sie eine Liste von Listen wie Sie kopieren, haben Sie immer noch die gleichen Liste Referenzen in Ihrer Liste. Du musst eine tiefe Kopie machen, um dein Problem zu lösen. Importiere das folgende Paket und ändere die Zeile new = original_2D[:] an:

 from copy import deepcopy original_2D = [['o', 'o', 'o'],['o', 'o', 'o']] for i in range(0,3): new = deepcopy(original_2D) # Change this line. new[0][i] = 'X' print new 
 import copy original_2D = [['o', 'o', 'o'],['o', 'o', 'o']] for i in range(0,3): new = copy.deepcopy(original_2D[:]) new[0][i] = 'X' print new 
  • Wie kann ich ein Ergebnis einer Funktion in einer Variable in Python speichern?
  • So verwenden Sie String-Formatierung, um Variablen dynamisch zuzuordnen
  • Python erstellen Variablen aus Wörterbucheinträgen
  • Wie benutzt man eine Variable in einem regulären Ausdruck?
  • Wie Verweise auf Variablen in Python aufgelöst werden
  • Erstellen oder Zuordnen von Variablen aus einem Wörterbuch in Python
  • Kann ich die variable Erweiterung in der Sphinx-Dokumentation unterdrücken?
  • Pyodbc - Wie man eine select-Anweisung mit einer Variablen für einen Parameter ausführt
  • Wie bekomme ich Python interaktive Konsole im aktuellen Namespace?
  • Wie man Variable in String in Python umwandelt
  • Variable Speichergröße in Python
  • Python ist die beste Programmiersprache der Welt.