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)
> > nechapu co se deje zde: > > a, b = b, a+b > > a jaky je rozdil nezi tim a mezi > > a = b > > b = a+b
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ě.
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]
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)