On 2024-08-06 20:57, Patrick Rudin <taxi...@gmx.ch> wrote: > nummern = [[5,5,5]] > nummern.append([9,9,9]) > > for a,b,c in nummern: > b += c > > nummern > Out[8]: [[5, 5, 5], [9, 9, 9]] > > Ich kapier das nicht. Funktioniert unpacking nur lesend?
Nein, aber int ist ein Immutable-Typ. Du kannst den Wert eines int-Objekts nicht ändern. > for a,b,c in nummern: > b += c Beim ersten Schleifendurchlaut zeigt b tatsächlich auf das selbe int-Objekt wie nummern[0][1] und c auf das selbe int-Objekt wie nummern[0][2]. (Tatsächlich zeigen sie sogar auf das selbe Objekt). b += c macht zwei Dinge: 1) Es ruft b.__iadd(c) auf. Wenn b mutable wäre, würde das den Wert des Objekts, auf das b zeigt ändern und das Objekt zurückliefern. Da das Objekt aber immutable ist, kann sein Wert nicht geändert werden. Es wird also ein neues Objekt (vom Typ int mit dem Wert 10) erzeugt und zurückgeliefert. 2) Der Returwert wird an b zugewiesen. b zeigt also jetzt auf das neue Objekt. nummern[0][1] zeigt aber immer noch auf das alten, denn dem hast Du ja kein neues zugewiesen. > Oder wie kann ich einen Wert während der For-Schlaufe ändern, ohne die > umständliche Notation zu verwenden? Es gibt mehrere Möglichkeiten. Wenn Du nummern in-place ändern willst, musst Du wohl die Indizes verwenden. Aber Du könntest auch eine List-Comprehension nehmen: nummern = [[a, b+c, c] for a, b, c in nummern] Das erzeugt aber eine völlig neue Liste und weist diese nummern zu. Wenn Du andere Variablen hast, die noch auch die alte Liste zeigen, dann tun sie das auch weiterhin. Es gibt einen sehr guten Vortrag zu dem Thema: Ned Batchelder - Facts and Myths about Python names and values - PyCon 2015 https://www.youtube.com/watch?v=_AEJHKGk9ns hp _______________________________________________ python-de Mailingliste -- python-de@python.org Zur Abmeldung von dieser Mailingliste senden Sie eine Nachricht an python-de-le...@python.org https://mail.python.org/mailman3/lists/python-de.python.org/ Mitgliedsadresse: arch...@mail-archive.com