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,
V Pythonu se nepracuje s proměnnými jako takovými, ale pouze referencemi na
objekt. Proto se přiřazením
R0work = R0
pouze změní reference na jeden a tentýž objekt. Pro naklonování, vytvoření
nového objektu, je potřeba zavolat něco takovéhoto:
R0work = list(R0)
S pozdravem,
Juda Kaleta
2010/10/
-best-way-to-copy-a-list-in-python.
S pozdravem
Marek Polášek
> Původní zpráva
> Od: Charlotte van Leeweneck
> Předmět: [python] nechtene propojeni mnozin
> Datum: 14.10.2010 12:27:03
>
> Dobry den,
>
> p
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 seznam
> R0=[]
> for x in range (8):
>R0.append(x)
Fuj, takhle pisou ceckari :-)
R0 = list(range(8))
> R0work=R0
R0Work = R0[:]
Udela melkou kopii - rez od zacatku do konce.
Slovnik ma metodu copy()
(Na hluboke kopirovani je modul "copy")
___
Python maili
Tohle je samozrejme taky moznost, ale pokud bys mel v R0 mutable
objekty, tak by sis porad nepomohl - list(R0) totiz jen zkopiruje
reference, nevytvari nove objekty. Mutable/immutable je (pro mne) asi
ta nejhur vysvetlitelna cast pythonu pro "novacky" (protoze se to
chova na prvni pohled dost nekon
fuj, takhle pisou lidi, co neumi python :) range(x) vraci list primo
:)) (okej, tenhle maly sarkasmus jsem si nemohl odpustit, doufam, ze
te neurazil:))
Jinak rikam - pokud jde o seznam immutable objektu, je melka kopie OK,
jen je dulezite vedet, jak se to zachova u pole mutable objektu, a
proc -
>Fuj, takhle pisou ceckari :-)
>R0 = list(range(8))
Fuj, proc z listu znova delat list ;-)
__ Informace od ESET NOD32 Antivirus, verze databaze 5530 (20101014)
__
Tuto zpravu proveril ESET NOD32 Antivirus.
http://www.eset.cz
___
Pyt
Pol, Leos (Thursday 14 October 2010 12:56:13):
> >Fuj, takhle pisou ceckari :-)
> >R0 = list(range(8))
>
> Fuj, proc z listu znova delat list ;-)
Protoze jsem se kdysi davno nekde docetl o planech sloucit range() a xrange(),
a zvykl jsem si v ramci dopredny kompatiblility explicitne si delat list
Hynek Fabian napsal...
> Pol, Leos (Thursday 14 October 2010 12:56:13):
> > >Fuj, takhle pisou ceckari :-)
> > >R0 = list(range(8))
> >
> > Fuj, proc z listu znova delat list ;-)
>
> Protoze jsem se kdysi davno nekde docetl o planech sloucit range() a
> xrange(),
> a zvykl jsem si v ram
Když už jste to nakously, nebylo by nejlepší použít:
> [i for i in xrange(8)]
>
? Umožňuje to i dělat složitější operace s iteracemi a tak je to asi
nejlepší...
2010/10/14 Petr Přikryl
>
> Hynek Fabian napsal...
> > Pol, Leos (Thursday 14 October 2010 12:56:13):
> > > >Fuj, takhle pisou ceck
Pokud ty složitější operace nepotřebuješ, tak je lepší předchozí
řešení (rychlejší). Takhle zbytečně vytváříš iteraci z iterace a pak
ji teprve převádíš na list a přidáváš si tak krok navíc.
2010/10/14 Visgean Skeloru :
> Když už jste to nakously, nebylo by nejlepší použít:
>>
>> [i for i in xrang
Ha, to mne vede k jednomu problému, kterej jsem řešil
potřeboval jsem generátor, kterej by mě vracel postupně buňky pravidelné sítě
(na pořadí mě nezáleží)
Itertools použít nemůžu, používám py 2.5
V tom generátoru můžu použít buď toto
[(a, b) for a in [1,2,3] for b in ['a','b']] #obslehnuto na
> for i in [(a,b) for a in range(1,10,2) for b in range(5,20,5)]:
Kdyz tady pouzijes na krajich kulate zavorky misto hranatych, tak se
to nevyrobi cele v pameti, ale vznikne generator, ktery se pak da
pouzit uplne stejne pro "for" cyklus:
Python 2.4.4 (#71, Oct 18 2006, 08:34:43) [MSC v.1310 32
14 matches
Mail list logo