Edit detail for ParalelniPrirazeni revision 1 of 1

1
Editor: pycz
Time: 2006/06/02 12:18:36 GMT+0
Note:

changed:
-
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) 


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)