[python] Modifikace seznamu bez kopirovnani (bylo SQLite - forma selectovaných dat)
Petr Prikryl
PrikrylP na skil.cz
Pondělí Leden 8 10:33:21 CET 2007
superman
> > Iterace není "read only". Read only jsou zpřístupňované objekty.
> Iterace je "read only" vzhledem k iterovanému objektu, což je
> občas dost nešikovné.
Tady se musím hádat. Přes iterátor mohu objekt zpřístupnit
jako přes jinou referenci. Pokud objekt lze modifikovat,
můžu jej prostřednictvím iterátoru modifikovat na místě.
> [...]
> > a = [(1,2),(3,4)]
> > for i in range(len(a)):
> > a[i] = list(a[i])
> >
> > Můžu přepsat na
> >
> > a = [ (1, 2), (3, 4) ]
> > for i, elem in enumerate(a):
> > a[i] = list(elem)
>
> Obávám se, ale že ten můj kód, tedy první verze bude
> rychlejší.
Čím je tato obava podložena? Tipnul bych, že k tomu
není důvod. Naopak bych čekal, že ta druhá verze bude
rychlejší. Dá se to změřit -- přenechávám iniciativu jiným.
> [...]
> > Pokud bych definoval svou vlastní třídu objektů
> > s celočíselnou hodnotou, které by mohly být modifikovány
> > (mutable), bylo by možné modifikovat seznam bez
> > vytváření nového.
>
> To jenom se snaží obejít "read only" vlastnost iterátoru.
> Jinak já jsem modifikoval seznam bez vytváření nového.
Důkaz vyvracející ničím nepodložený mýtus o "read-only"
iterátorech:
class T(object):
def __init__(self, hodnota):
self.hodnota = hodnota
def __repr__(self):
return repr(self.hodnota)
a = [ 1, 2, 3, 4, 5 ]
lst = [ T(e) for e in a ]
print lst
for t in lst:
t.hodnota += 3
print lst
pepr
Další informace o konferenci Python