Dotaz z konference
> > nechapu co se deje zde: > > a, b = b, a+b > > a jaky je rozdil nezi tim a mezi > > a = b > > b = a+b
Odpověď
Zkusme to s čísly a=2 a b=3.
Pak první zápis znamená:
a, b = 3, 2+3
V a bude 3, v b bude 5. V druhém případě...:
a = 3 b = a+3
v a
bude zase 3, ale v b
bude 6,
protože a
před druhým přiřazením
získalo novou hodnotu a součet
je tedy jiný.
Přiřazení tohoto typu se v někdy nazývá také *paralelní přiřazení* (multiple assignment -- multiple ve smyslu více proměnným najednou). Nejdříve se vyhodnotí **celá** pravá strana, poté se přiřadí levé straně.
Podrobnější vysvětlení
V Pythonu to jde o něco přesněji vysvětlit také nějak takto (jak správně poznamenal jvit):
Pokud uvedu místo jednoho výrazu více výrazů oddělených čárkami, vznikne n-tice (anglicky tuple, v příkladu konkrétně dvojice). Každý výraz je vyhodnocen zvlášť a jeho výsledek se dosadí jako člen vznikající n-tice).
Efekt paralelního přiřazení vzniká díky
dalšímu kroku, kdy se členy výše popsané
n-tice postupně spojí s jmény na levé
straně přiřazení. V té době už jsou všechny
výrazy na pravé straně vyhodnoceny a
jména a
a b
se tedy spojí s novými, již
existujícími hodnotami.
To znamená, že například zápis a, b = 1, 2
se vlastně
chová jako (a, b) = (1, 2)
.
Místo n-tice lze ovšem použít i normální seznam:
[a,b] = [1,2] a, b = [1, 2]
Časté využití
Tento obrat se často používá pro výměnu obsahu dvou proměnných bez použití pomocné proměnné:
a, b = b, a
Bez této možnosti bychom pro výměnu obsahu dvou proměnných museli použít třetí, pomocnou proměnnou:
c = a # uschováme si původní obsah proměnné a a = b # přiřadíme jí obsah proměnné b b = c # b získá původní hodnotu proměnné a, uschovanou v c
Další elegantní obrat je inicializace proměnných v případě že pravá strana obsahuje funkci, která vrací seznam (nebo n-tici):
JEDNA, DVA, TRI, CTYRI = range(1,5)