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

Listssind 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".

Verwandte Artikel


AJAX wird nicht aufgerufen, wenn das Auswahlfeld geändert wurde

Benutzer813813 Ich verwende jquery, um ein PHP-Skript aufzurufen, wenn sich ein Auswahlfeld ändert. Ich kann die ID des sich ändernden ausgewählten Elements abrufen, erhalte jedoch keine Ausgabe vom PHP-Skript. Das Javascript ist function initagents() { $('s