Das Listenattribut des Objekts wird geändert, wenn del für ein anderes Attribut aufgerufen wird
Nazzaroth
Das Verhalten des folgenden Codes verwirrt mich:
data = [0,1,2,3,4,5]
class test():
def __init__(self,data):
self.data=data
self.data2=data
def main(self):
del self.data2[3]
test_var = test(data)
test_var.main()
print(test_var.data)
print(test_var.data2)
Was ich denke, sollte herauskommen, ist Folgendes:
[0,1,2,3,4,5]
[0,1,2,4,5]
Was ich bekomme ist folgendes:
[0,1,2,4,5]
[0,1,2,4,5]
Warum wird ein Element aus der zweiten Liste gelöscht, wenn es nicht direkt geändert wird? Oder behandelt Python Attribute so, dass dies normal geschieht?
Wie soll ich den Code ändern, damit ich das bekomme, was ich will?
hspandher
Lists
sind in Python veränderbar und werden als Referenz übergeben. Wann immer Sie es zuweisen oder als Argument übergeben, wird ein Verweis darauf übergeben und keine Kopie. Daher das Ergebnis, das Sie sehen. Wenn Sie es wirklich mutieren möchten, müssen Sie es tief kopieren.
import copy
class test():
def __init__(self, data):
self.data = copy.deepcopy(data)
self.data2 = copy.deepcopy(data2)
# if the list is going to be flat and just contain basic immutable types,
# slicing (or shallow-copy) would do the job just as well.
class test():
def __init__(self, data):
self.data = data[::] # or data[:] for that matter as @Joe Iddon suggested
self.data2 = data[::]
Hinweis: Nicht alle Objekttypen unterstützen das "Deep-Copying".