2017-07-05 2 views
-1

Ich habe gerade etwas Interessantes in Python2.6 entdeckt und habe mich gefragt, ob das so sein sollte oder es einen Bug gibt. HierPython überschreibt Liste, die in der Klassenfunktion innerhalb einer anderen Funktion in derselben Klasse verwendet wird

ist der Code:

class Test: 
    def __init__(self, test): 
     self.test = test 

    def test1(self, testarg1): 
     self.test2(testarg1) 
     return testarg1 

    def test2(self, testarg1): 
     testarg1[0] = 9 

p1 = Test('test') 
print (p1.test1([1,2,3])) 

So ist der Code über Rückkehr als Ergebnisliste [9,2,3], aber unter Verwendung von test2 Funktion, die ich nie die geänderte Liste zurückzukehren. Bedenken Sie auch, dass es nicht cool ist, den gleichen Namen für Argumente in Funktionen in derselben Klasse zu haben. Das Ändern der Variablennamen hilft nicht.

Auch die vollständige Zuweisung testarg1 in Funktion test1 zu einer anderen Variablen und die Übergabe es hilft nicht immer noch das Ergebnis oben zurückgeben. Wer kann weiter erklären, warum das passiert?

+1

Listen sind _mutable_ und alles wird von _reference_ übergeben. Sie haben den Inhalt der Liste in "test2" geändert, auch wenn Sie ihn nicht zurückgeben. –

+0

Danke für die Erklärung, habe nicht daran gedacht. In anderen Sprachen verwendet und nie passiert, rate ich muss die Liste kopieren, bevor Sie es für Schecks ändern. –

+0

ja: kopieren wie diese 'list (testarg1)' oder 'testarg1 [:]' –

Antwort

2

Als Jean-Francois hat bereits erklärt alles durch Referenz übergeben wird, und Sie haben die Liste in test2.If Ihr Ziel war es, zu verstehen Methode überwiegenden einen Blick auf diesem Beispiel

class Parent(object): 
    def __init__(self): 
     self.value = 5 

    def get_value(self): 
     return self.value 

class Child(Parent): 
    def get_value(self): 
     return self.value + 1 

Methoden sowohl in den Kindern geändert Klasse und in der Elternklasse haben denselben Namen und das ist entscheidend. Dann werden wir haben

c = Child() 
c.get_value() 
6 
+0

Eigentlich ist mir das Überschreiben der Methoden klar, aber als PHP- und Perl-Entwickler änderbare Listen in Python waren irgendwie verwirrend, weil mir das noch nie passiert ist . Das Lesen über veränderlich und unveränderlich macht Sinn. Danke trotzdem. –

Verwandte Themen