[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