2017-11-03 6 views
1

Hier ist mein Code:Ändern Instanzvariablen in Python ändert sich auch die ursprüngliche Liste

class Foo(object): 
    def __init__(self, x, y): 
     self.x  = x 
     self.y  = y 

    def func(self): 
     self.x[0] -= 1 
     self.y -= 1 


x = [10] 
y = 10 



a = Foo(x, y) 
a.func() 

print(x, y) 

Ausgang ist ([9], 10). Warum ändert das Übergeben einer Liste an eine Instanzvariable und das Ändern der Instanzvariable auch die ursprüngliche Liste, aber nicht die ursprüngliche Ganzzahl?

Wie übergibt man eine Liste an eine Instanzvariable in Python und ändert dann die Instanzvariable, ohne die ursprüngliche Liste zu beeinflussen?

+0

Haben Sie eine Kurzanleitung zu Python-Variablen und Zuweisung: https://nedbatchelder.com/text/names.html – user2357112

+0

Sie könnten auch denken, dass Sie auf Python 3 sind, aber diese 'Print'-Ausgabe sagt, dass Sie nicht sind . (Python 3 hätte "[9] 10" gedruckt.) – user2357112

+0

Danke, das hat geholfen! self.x = Liste (x) löste es –

Antwort

1

Ich glaube, das ist, weil Listen veränderbar sind, während ganze Zahlen unveränderlich sind. Sobald Sie eine Liste ändern, wird dieselbe Liste zurückgegeben. Sobald Sie eine Ganzzahl ändern, wird eine Kopie der Ganzzahl zurückgegeben. So func ändert sich die x, aber eine neue y

0

Die Liste ist ein veränderbares Objekt; Die Zuweisung kopiert die Referenz, sodass Sie das ursprüngliche Objekt ändern, wenn Sie den Wert eines Elements ändern.

Eine ganze Zahl ist nicht änderbar; Wenn Sie den Wert ändern, ändert Python den Verweis auf ein neues Objekt mit dem neuen Wert. self.y bezieht sich nicht mehr auf das gleiche Objekt wie y.

Verwandte Themen