Python einzelnes Listen element verändern

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
n1klas
User
Beiträge: 6
Registriert: Sonntag 1. Januar 2023, 20:02

Hallo, vor kurzem habe ich etwas in Python festgestellt, was ich mir selber nicht so ganz erklären kann.
Code:

Code: Alles auswählen

list = [[]] * 3
list[1].append(1)
print(list)
Ausgabe = [[1], [1], [1]]

Ich verstehe nicht so ganz, warum zu jeder Liste in der Liste die 1 hinzugefügt wird, obwohl man ja eigentlich mit

Code: Alles auswählen

list[1].append(1)
nur zur zweiten Liste etwas hinzufügt, ich hätte gedacht die Ausgabe sieht so aus:
Ausgabe = [[ ], [1], [ ]]
Kann mir das jemand erklären?

Liebe Grüße Niklas
Zuletzt geändert von n1klas am Sonntag 19. Februar 2023, 21:30, insgesamt 1-mal geändert.
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

etwas "list" zu nennen ist unglücklich, weil damit der interne Name "list" verdeckt wird.

Was vermutest du denn, was der erste Befehl tut?
Und worauf deutet das Verhalten hin, was er wirklich tut?

Übrigens fügst du nicht etwas zum ersten Element der Liste hinzu sondern zu dem zweiten.
n1klas
User
Beiträge: 6
Registriert: Sonntag 1. Januar 2023, 20:02

Ich würde denken das ein normales Listenobjekt erzeugt wird, welches 3 weitere Listen Objekte enthält.
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Wie das Verhalten zeigt, erstellt es eine Liste und tut diese Liste 3 Mal in eine andere Liste.
Es ist also 3 Mal die selbe Liste enthalten.

Das kann man auch relativ einfach prüfen:

Code: Alles auswählen

In [11]: containers = [[]] * 3

In [12]: for container in containers:
    ...:     print(id(container))
    ...:
2898723980416
2898723980416
2898723980416

In [13]:
n1klas
User
Beiträge: 6
Registriert: Sonntag 1. Januar 2023, 20:02

ahh verstehe, gibt es eine Möglichkeit eine Liste mit mehreren Listen zu erstellen, aber ohne das es sich um die gleichen Objekte Handelt?
Benutzeravatar
pillmuncher
User
Beiträge: 1530
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@n1klas: Ja.

Code: Alles auswählen

>>> things = [[] for _ in range(3)]
>>> things
[[], [], []]
>>> things[1].append('hallo')
>>> things
[[], ['hallo'], []]
Siehe auch hier: https://docs.python.org/3/tutorial/data ... rehensions.
In specifications, Murphy's Law supersedes Ohm's.
Antworten