[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