[python] Referencia

David Necas (Yeti) yeti na physics.muni.cz
Pátek Únor 3 14:27:01 CET 2006


On Fri, Feb 03, 2006 at 01:38:09PM +0100, balky wrote:
> no globals[A] nemozem pouzit pretoze....
> 
> Asi musim viac osvetlit na com robim.
> 
> Robim Celularny Automat. Je to vlastne pole buniek. Kazda bunka ma 
> nejaky stav, ktory sa meni v kazdej iteracii na zaklade prechodovej 
> funkcie. No a prechodova funkcia meni stav bunky na zaklade okolia bunky 
> podla danych pravidiel CA. Okolie je bud
> 
> Mooreove okolie
> xxx
> xbx
> xxx
> 
> alebo von Neumanove okolie
> x
> xbx
> x

Problém jako stvořený pro C, jak datovým modelem, tak
potřebou rychlosti jednoduchých operací... No nic.

> Toto vsak nie je podstatne. Podstatne je to, ze kvoli zrychleniu 
> vypoctov, kazda bunka je trieda, ktora vie svoj stav a obsahuje 
> referencie na svoje okolie. T.j. ma ako clensku premennu pole, v ktorom 
> su referencie na susedov bunky. Cize
> 
> vesmir = numpy.empty((x,y),dtype=object)
> for x in xrange(x):
>  for y in xrange(y):
>    bunka = vesmir[x][y]  
>    bunka.okolie = numpy.empty((3,3),dtype=object)
>    bunka.okolie[1][1] = vesmir[x-1][y-1]
>    bunka.okolie[1][2] = vesmir[x][y-1]
>    bunka.okolie[1][3] = vesmir[x+1][y-1]
>    bunka.okolie[2][1] = vesmir[x-1][y]
>   atd....
> 
> Samozrejme, ze u seba to mam napisane inak - toto je nazorne pre pochopenie.
> 
> Ako spravim to, ze ked zmenim napr. vesmir[5][5], aby sa mi zmeny 
> reflektovali aj do okoli vsetkych buniek, ktore maju bunku vesmir[5][5] 
> ako svoje okolie
> 
> Dufam, ze som to vysvetlil jasne. Ak nie pytajte sa upresnim.

Problém je, že s pythonovskými poli to samozřejmě funguje:

    class Cell:
        pass

    x = 5
    y = 5
    universe = [[Cell() for j in range(x)] for i in range(y)]
    for ii, row in enumerate(universe):
        for jj, cell in enumerate(row):
            cell.neighbourhood = (universe[ii][(jj + 1) % x],
                                  universe[ii][(jj + x-1) % x],
                                  universe[(ii + 1) % y][jj],
                                  universe[(ii + y-1) % y][jj])

    print hasattr(universe[2][3], 'foo')
    cell = universe[2][2]
    cell.neighbourhood[0].foo = 'bar'
    print universe[2][3].foo

Nemám žádnou verzi numpy, která by znala dtype=object,
(používám numarray) a nebudu si kupovat(!) dokumentaci
numpy, takže co vlastně dělá s objekty, bude nejlepší se
zeptat autora...

Klíčová otázka je, zda

    id(bunka.okolie[1][1]) == id(vesmir[x-1][y-1])

Pokud ano, tak se při zjišťování, zda se změnil, díváš na
špatný objekt, protože jeden objekt se nemůže zároveň změnit
i nezměnit. Pokud ne, tak je otázka, jak k tomu dochází.

Yeti


--
That's enough.



Další informace o konferenci Python