2017-06-21 3 views
1

Ich habe es wirklich schwer zu versuchen, das Verhalten dieses Codes unten zu verstehen. In Python 3.6List.append/extend + Operatoren und + =

Der folgende Beispielcode ist eine Abstraktion meines tatsächlichen Codes. Ich habe dies getan, um mein Problem besser zu beschreiben. Ich versuche, eine Liste zu einer anderen Liste hinzuzufügen. Ergebnis in einer zweidimensionalen Liste. Zum Zweck der Überprüfung der Mitgliedschaft dieser Liste zu einem späteren Zeitpunkt. Obwohl ich nicht in der Lage bin, meine Liste so hinzuzufügen, wie ich Eg möchte.

a_list = [] 
another_list = [7,2,1] 

a_list.DONT_KNOW(another_list) 
another_list = [7,3,1] 

Ergebnisse:

a_list 
[[7,2,1]] 
another_list 
[7,3,1] 

Beispiel meiner Frage:

class foo: 
    def __init__(self): 
     self.a_list = [] 
     self.another_list = [0] 
####### Modifying .extend/.append############## 
     self.a_list.append(self.another_list) # .append() | .extend(). | extend([]) 
############################################### 
    def bar(self): 
######## Modifying operator######## 
     self.another_list[0] += 1 #    += | + 
################################### 
     print('a_list = {} another_list = {} '.format(self.a_list, self.another_list)) 

def call_bar(f, repeats): 
    x = repeats 
    while x > 0: 
     x -= 1 
     foo.bar(f) 

f = foo() 
call_bar(f,3) 

5 Mal wiederholt. Ändern der list.function und des increment-Operators. Ausgänge:

 # .append() and += 
a_list = [[1]] another_list = [1] 
a_list = [[2]] another_list = [2] 
a_list = [[3]] another_list = [3] 

     # .extend() and += 
a_list = [0] another_list = [1] 
a_list = [0] another_list = [2] 
a_list = [0] another_list = [3] 

     # .append() and + 
a_list = [[1]] another_list = [1] 
a_list = [[2]] another_list = [2] 
a_list = [[3]] another_list = [3] 

     #.extend() and + 
a_list = [0] another_list = [1] 
a_list = [0] another_list = [2] 
a_list = [0] another_list = [3] 

     #.extend([]) and + 
a_list = [[1]] another_list = [1] 
a_list = [[2]] another_list = [2] 
a_list = [[3]] another_list = [3] 

Beachten Sie, dass in allen diesen Beispielen, wenn ich die zweidimensionale Anordnung bekommen (ich brauche). Die Werte in a_list ändern sich bei der Bearbeitung another_list. Wie bekomme ich den Code dazu?

 #SOME METHOD I DON'T KNOW 
a_list = [[0]] another_list = [1] 
a_list = [[0]] another_list = [2] 
a_list = [[0]] another_list = [3] 
+0

a_list.append (another_list [:]) – happydave

+0

Das funktioniert tatsächlich. Die Verwendung eines Slice muss eine Kopie zurückgeben Ich nehme es? –

+0

Ja, es kopiert jeden Eintrag in der Liste. Manche Leute halten es für den idiomatischen Weg, eine Liste zu kopieren, manche halten es einfach für hässlich. – happydave

Antwort

0

Sie haben self.a_list.append(self.another_list.copy()) zu verwenden, um einen Schnappschuss von another_list zu erstellen, die dann zu a_list hinzugefügt wird. Ihr Code fügt another_list als Element von a_list tatsächlich hinzu, so ist es natürlich, dass spätere Änderungen den Inhalt dieses Objekts ändern würden.

+0

Super! Danke Kumpel. Macht Sinn, obwohl nicht sofort offensichtlich. \ –

+0

Gern geschehen. Bitte markieren Sie die Antwort als akzeptiert, wenn sie Ihr Problem löst. Glückliche Kodierung! – fxx

0

Wenn Sie a_list als [[0]] unabhängig davon bleiben wollen, was in another)list auf den ersten Wert der Fall ist, warum nicht initialisiert werden nur als [[0]] in __init__?

def __init__(self): 
    self.a_list = [[0]] 
    self.another_list = [0] 
    # End of __init__; nothing else 

Mit append Sie eine Referenz von another_list als erstes Element von a_list hinzuzufügen. Mit extend fügen Sie die Referenzen der Elemente another_list in a_list hinzu.

+0

Nicht ganz das, was ich erreichen möchte. Obwohl die Erklärung von append und extend ist dankbar :) –

+0

Np, aber was versuchst du zu erreichen? B/c meine Antwort erzeugt die gleichen Ergebnisse wie die, die Sie als richtig markiert haben, vermeidet aber den Aufruf von 'copy()'. –

+0

"Ich versuche, eine Liste zu einer anderen Liste hinzuzufügen. Dies führt zu einer zweidimensionalen Liste. Zum Zweck der Überprüfung der Mitgliedschaft dieser Liste zu einem späteren Zeitpunkt." –