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)