„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Warum werden Listen miteinander verknüpft, wenn [[]] * n in der Python-Listeninitialisierung verwendet wird?

Warum werden Listen miteinander verknüpft, wenn [[]] * n in der Python-Listeninitialisierung verwendet wird?

Veröffentlicht am 05.11.2024
Durchsuche:516

Why Do Lists Linked Together When Using [[]] * n in Python List Initialization?

Problem bei der Listenverknüpfung bei der Listeninitialisierung mit [[]] * n

Beim Initialisieren einer Liste von Listen mit [[]] n, Programmierer stoßen häufig auf ein unerwartetes Problem, bei dem die Listen scheinbar miteinander verknüpft sind. Dies liegt daran, dass die [x]n-Syntax mehrere Verweise auf dasselbe zugrunde liegende Listenobjekt erstellt, anstatt unterschiedliche Listeninstanzen zu erstellen.

Um das Problem zu veranschaulichen, betrachten Sie den folgenden Code:

x = [[]] * 3
x[1].append(0)
print(x)

Die Ausgabe dieses Codes ist:

[[0], [0], [0]]

Anstelle der erwarteten Ausgabe:

[[], [0], []]

Das Problem ergibt sich aus der Tatsache, dass jedes Element in der Liste eine Referenz auf dasselbe Listenobjekt ist. Wenn eines der Elemente geändert wird, sind alle anderen Elemente betroffen.

Um eine Liste wirklich unterschiedlicher Listen zu erstellen, besteht der richtige Ansatz darin, Listenverständnis zu verwenden:

x = [[] for i in range(3)]

Diese Syntax erstellt ein neues Listenobjekt für jedes Element in der Liste und stellt so sicher, dass sie unabhängig sind.

Der folgende Code dient als Demonstration:

In [20]: x = [[]] * 4

In [21]: [id(i) for i in x]
Out[21]: [164363948, 164363948, 164363948, 164363948] # same id()'s for each list,i.e same object


In [22]: x=[[] for i in range(4)]

In [23]: [id(i) for i in x]
Out[23]: [164382060, 164364140, 164363628, 164381292] #different id(), i.e unique objects this time
Freigabeerklärung Dieser Artikel wird unter folgender Adresse abgedruckt: 1729212379 Bei Verstößen wenden Sie sich bitte an [email protected], um ihn zu löschen
Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3