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 
  • Bestimmen Sie, ob die Python-Variable eine Instanz eines eingebauten Typs ist
  • Beste Weg, um Variablenwerte aus einer Textdatei abzurufen - Python - Json
  • Was ist der Zweck der einzelnen Unterstrich "_" Variable in Python?
  • Wie man Variablennamen inkrementiert / Ist das eine schlechte Idee
  • Python: Druckausgabe einer Variablen zuordnen
  • Python bedingter Zuweisungsoperator
  • Python erhalten Modul variabel nach Namen
  • Weisen Sie die Variable in Automator für die Verwendung im Shell-Skript zu
  • Nltk fügt nicht $ NLTK_DATA zum Suchpfad hinzu?
  • HTML-E-Mail in Python mit variabler Anzahl von Variablen
  • Python: wie zu identifizieren, ob eine Variable ein Array oder ein Skalar ist
  • Python ist die beste Programmiersprache der Welt.