Skrivet av JJ72:
Ja, men...
Om a = a + b, så borde ju även a = b + a
Det är inte en ekvation, utan likhetstecknet betyder tilldelning. Det är en generell konvention i programmeringsspråk. Ett enkelt likhetstecken blir i detta sammanhang egentligen "riktat" och skulle kanske tydligare kunna skrivas
(OBS: bara illustrativt; det är inte giltig Pythonsyntax) dvs "beräkna a + b och lagra resultatet i variabeln a". Det är detta som är insikten som behövs för att lösa dina uppgifter, skulle jag säga, så se till att du har koll på detta. Hade det varit en ekvation så hade "a = a + b" implicerat att b = 0, eller något, men det kommer inget vettigt av att se det så överhuvudtaget här.
Att a + b inte är samma sak som b + a kan man generellt säga är för att strängar (som både a och b här representerar) inte kommuterar när "+" definieras som "lägg ihop dessa strängar". "Py" + "thon" ger "Python", men "thon" + "Py" ger "thonPy". Att a + b = b + a (med matematiskt likhetstecken) gäller för "vanliga" tal som de som man ser under "vanlig" matematikutbildning är egentligen en speciell egenskap hos dessa tal, snarare än något som är universellt sant, men att gå in på kommutativitet, osv, är egentligen bara att krångla till saker — minns bara att =
i programmeringssammanhang inte är samma =
som du använt i dina mattekurser.
För att testa likhet i programmeringssammanhang så använder man snarare ==
, och för olikhet dess kompisar !=
, <=
, >=
, <
, >
.
Tillägg: Jag hittade detta svar av en slump en tid efter att jag skrivit det, och störde mig lite på den terminologi jag använde — specifikt uttrycket "lagra resultatet i variabeln a".
Rent pedagogiskt så fungerar det i hög grad att visualisera processen så, men vad just Python i praktiken gör är att skapa ett nytt objekt med värde a + b (där a och b är referenser till tidigare skapade objekt) och döpa en referens till detta nya objekt till a, och därmed ersätta den referenspekare som a tidigare innehöll. Om det objekt som namnet a tidigare refererade till då inte längre har några referenser kvar i programmet så kommer det sedermera raderas av Pythons skräpsamlare.
En ytterligare notis är att ett uttryck som a += b
inte av nöden gör samma sak som a = a + b
i Python. Ifall det objekt a pekar på har en __iadd__
-metod definierad så kommer denna kallas, och per konvention så kommer objektet a pekar på själv ändras, snarare än att skapa ett nytt objekt. Handlar det om omuterbara objekt (vilket i Python inkluderar bl a strängar och tal) så kommer dock a av nöden pekas om till ett nytt objekt likväl.
När distinktionen mellan dessa tillvägagångssätt börjar bli viktig så förstår man nog redan varför, men om någon hittar detta svar så ska man veta att det är förenklat för pedagogikens skull.