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

Reply via email to