[python] nechtene propojeni mnozin

rajcze rajcze na gmail.com
Čtvrtek Říjen 14 12:44:09 CEST 2010


Problem je v tom, ze seznam (list) je neco, cemu se v pythonu rika
"Mutable" - tj. menitelny objekt.

V praxi to znamena, ze pokud si vytvoris promennou R0 a priradis ji
prazdny seznam, tak ve skutecnosti _nastavujes ukazatel R0 na misto
pameti, kde se nachazi ten seznam_. Potom kdyz do toho seznamu neco
pridas pomoci append, nevytvori se novy seznam, ale jen se zmeni obsah
toho mista v pameti.

Potom kdyz udelas R0work = R0, tak nekopirujes cely ten seznam, ale
jen hodnotu toho ukazatele. Tj. R0 i R0work ukazuji na stejne misto v
pameti -> je to "jakoby" ta stejna promenna.

Takze pokud ches pracovat s R0work, aniz bys menila R0, je potreba ho
zkopirovat. (Predpokladam, ze ta inicializace byl prostre trivialni
priklad, ne zpusob, jak to ve skutecnosti inicializujes. Pokud ano,
tak je zbytecne "neoptimalni".)

R0=[]
for x in range (8):
   R0.append(x)
R0work=R0
print id(R0), id(R0work)
R0work[-1]=0
print id(R0), id(R0work)
print(R0)
print (R0work)


tady vidis, ze to je porad ten stejny kus pameti. (kdyz si neco
takoveho zkusis s retezci, uvidis, ze pri druhem vypisu budou id()
ruzna - string je totiz immutable - s kazdou zmenou se vytvari jeho
nova instance).

Takze tvuj kus kodu, ve funkcni podobe, by byl asi takovyto

from copy import deepcopy

R0 = range(8)
R0work = deepcopy(R0)
R0work[-1] = 0
print R0, R0work

Nevim, jake mas zkusenosti s programovanim v jinych jazycich, takze se
omlouvam, pokud to bylo prilis detailni/strucne - klidne se ptej dal,
pokud ti neco neni jasne :)

joza

2010/10/14 Charlotte van Leeweneck <vanleeweneck.charlotte na gmail.com>:
> Dobry den,
>
> potrebovala bych pomoci s nasledujicim problemem.
>
> R0=[]
> for x in range (8):
>    R0.append(x)
> R0work=R0
> R0work[-1]=0
>
> print(R0)
> print (R0work)
>
>
> Cílem bylo, aby mi to nahradilo posledni prvek v mnozine R0work prvkem 0,
> ale mozinu R0 nechalo nedotcenou
> tj. pozadovaný vysledek R0=[0, 1, 2, 3, 4, 5, 6, 7], R0work=[0, 1, 2, 3, 4,
> 5, 6, 0]
> Bohuzel to tak nefunguje a nahrazuje posledni prvek v obou mnozinach. Kde
> delam chybu?
>
>
> Dekuji za odpoved.
> Sarka
>
>
> _______________________________________________
> Python mailing list
> Python na py.cz
> http://www.py.cz/mailman/listinfo/python
>



-- 
Rules of Optimization:
Rule 1: Don't do it.
Rule 2 (for experts only): Don't do it yet.


Další informace o konferenci Python