Article View: pl.comp.lang.python
Article #27280Re: odwolywanie sie w funckji do tej samej funkcji
From: Sebastian Kaliszewski
Date: Thu, 28 Jan 2010 14:54
Date: Thu, 28 Jan 2010 14:54
171 lines
6468 bytes
6468 bytes
Slawomir Piasecki wrote:
> czesc wszystkim
>
> mam problem z pythonem
>
> w skrocie mam wlasna funkcje w ktorej mam petle i w tejze petli
> odwoluje sie do tej samej funkcji, i mam problem z zmienna nr
>
> [code]
> def bRun(val, name, bf, res, bfpt, info, mlt, pr, nr = {0:1}, check =
> False):
> solutions = {}
> new, cz = runF(val, name, bf, res, check)
> solt = oneTab(new)
> lst = nr.keys()[-1]
> last = glMulti(nr)
>
> if solt["e"] > 0 and last < mlt:
> m = 1
>
> solutions[lst] = {"data" : solt, 'mlt' : last}
> tmp = newName(name, nr, True)
>
> if len(nr) == 1:
> fwrite("dane.%s.dat" % tmp, info, {"dat":val,"UZR" : "{5: %s}" %
> bf})
>
> else:
> fwrite("dane.%s.dat" % tmp, info, {'ISW' : -1, 'NTST' : 1000,
> 'IRS' : 1, 'UZR' : '{5 : %s}' % bf})
>
> perLoop = periodInfo(cz, bfpt, last)
>
> if len(perLoop) > 0:
> solutions[lst]["next"] = {}
> step = 1
>
> for i in perLoop:
> var = getSelectData(val, i)
> nr[lst + 1] = perLoop[i][0]
> last = glMulti(nr)
>
> if last < mlt and lst < 3:
> tmp = newName(name, nr)
>
> multiPerVar(var, pr, tmp, last)
> tmpNr = nr
> solutions[lst]["next"][step] = bRun(val, tmp, bf, res, bfpt,
> info, mlt, pr, tmpNr, "rtbp2")
>
> step += 1
>
> if len(solutions[lst]["next"]) == 0:
> del solutions[lst]["next"]
>
> return solutions
> [/code]
>
> nie wiem jak to porzadnie wytlumaczyc, wiec sprobuje to wytlumaczyc na
> tym przykladzie
>
> wiec zalozmy po pierwszym wywolaniu zmienna perLoop ma dwie zmienne,
> wiec petla sie wykona dwukrotnie, pierwsze wykonanie oznaczmy A a
> drugie B, teraz wykonujac A znajdujemy ze zmienna nr ma postac, {0:
> 1], i nowe perLoop ma 3 zmienne ktore wykonujemy i tam zmienna ma
> postac {0:1, 1:x}
> i tu spelniaja sie warunki ktore uniemozliwiaja mi kolejne wywolanie
> funkcji bRun wiec wracam do elementu B
> ale niestety tutaj napotykam problem, gdyz wg. mnie zmienna nr powinna
> miec teraz postac {0:2} natomiast to co otrzymuje to jest {0:2, 1:x}
> jesce zanim znajde czy nowy perLoop ma jakies elementy,
>
> z tego wnioskuje ze zmienna nr nie jest zmienna lokalna, czego
> zupelnie nie rozumiem, gdyz myslalem
> ze zmienne w funkcji sa lokalne, a tu widze na swoim przykladzie ze
> tak nie jest, bo gdyby tak bylo to zmienna nr po wykonaniu A i
> kolejnych wywolaniach bRun powinna miec postac {0:1,1:x,....} ale w
> momencie jak startuje z B powinna miec postac {0:2}
>
> mam nadzieje ze mnie ktos zrozumie i wytlumaczy mi gdzie zle mysle,
> lub gdzie popelnilem blad
> dzieki za wyrozumialosc, pewnie cos tu bedzie nie zrozumiale wiec
> pytajcie moze
> uda mi sie jakos inaczej rozjasnic o co mi chodzi
W Pythonie nazwy obiektów to nie to co obiekty. W powyższym kodzie nr i
tmpNr to różne nazwy tego samego obiektu. Jak chcesz mieć inny obiekt
to go musisz gdzieś utworzyć.
Zamiast bezskutecznego kombinowania z tmpNr zmień wołanie
solutions[lst]["next"][step] = bRun(val, tmp, bf, res, bfpt, info, mlt,
pr, tmpNr, "rtbp2")
na:
solutions[lst]["next"][step] = bRun(val, tmp, bf, res, bfpt, info, mlt,
pr, dict(nr), "rtbp2")
Ogólnie:
Generalnie wyróżnia się 4 (w miarę typowych) semantyk (sposobów)
gorliwego (tj. nie leniwego) przekazywania parametrów...
Zakładamy że mamy funkcję:
fun(a, b, t, u):
print a, b, t[0], u[1]
tmp = a
a = b
b = tmp
t[0] = 13
u[1] = 19
oraz kod ją wołający
a = 10
b = 20
tab = [7, 5]
fun(a, b, tab, tab)
print a, b, tab[0], tab[1]
1. Przez wartość -- lokalnie tworzone są nowe zmienne do których
kopiowane są przekazane w wołaniu wartości -- ww. kod wypisze :
10 20 7 5
10 20 7 5
2. Przez zmienną -- w parametrze przekazuje się (referencję na) zmienną,
niejako tworzy się alias przekazywanej zmiennej, wszelkie zmiany
parametru, łącznie z przypisaniem są widoczne na zewnątrz funkcji -- ww.
kod wypisze:
10 20 7 5
20 10 13 19
3. Przez kopię -- lokalnie tworzone są nowe zmienne do których kopiowane
są przekazane w wołaniu zmienne (czyli tak w 1.), ale na zakończenie
działania funkcji wartości tych lokalnych zmiennych utworzonych wg
parametrów są kopiowane z powrotem do przekazanych w wołaniu zmiennych;
kłopot taki że jak się przekaże 2 razy tę samą zmienną to mogą być
"zabawne" efekty -- ww. kod wypisze:
10 20 7 5
20 10 7 19
lub
10 20 7 5
20 10 13 5
zależnie od kolejności kopiowania parametrów na zakończenie funkcji
4. Przez obiekt -- odróżniamy nazwę zmiennej (obiektu) od jej wartości,
lokalnie powstaje nowa nazwa, dowiązane do nowego obiektu, czyli
podobnie do 2. ale lokalne przypisanie nie jest widoczne na zewnątrz,
tylko lokalna mutacja jest -- ww. kod wypisze:
10 20 7 5
10 20 13 19
Python używa właśnie 4 sposobu
Podsumowując:
zakłądałeś, że Python używa 1. sposobu a on używa 4.
pzdr
\SK
--
"Never underestimate the power of human stupidity" -- L. Lang
--
http://www.tajga.org -- (some photos from my travels)
Technical Details
Message-ID:
<pth837-dcp.ln1@bozon.softax.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news2.icm.edu.pl!news.prz.edu.pl!news.nask.pl!news.nask.org.pl!goblin2!goblin.stu.neva.ru!newsfeed1.swip.net!npeer02.iad.highwinds-media.com!news.highwinds-media.com!feed-me.highwinds-media.com!nx02.iad01.newshosting.com!newshosting.com!newsfeed.neostrada.pl!unt-exc-02.news.neostrada.pl!atlantis.news.neostrada.pl!news.neostrada.pl!bozon.softax.pl!newsReferences:
<546bbaa8-dce5-4be1-a4ef-26cd9be394d3@p24g2000yqm.googlegroups.com>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news2.icm.edu.pl!news.prz.edu.pl!news.nask.pl!news.nask.org.pl!goblin2!goblin.stu.neva.ru!newsfeed1.swip.net!npeer02.iad.highwinds-media.com!news.highwinds-media.com!feed-me.highwinds-media.com!nx02.iad01.newshosting.com!newshosting.com!newsfeed.neostrada.pl!unt-exc-02.news.neostrada.pl!atlantis.news.neostrada.pl!news.neostrada.pl!bozon.softax.pl!news From: Sebastian Kaliszewski <s.bez_spamu@remove.this.informa.and.that.pl> Newsgroups: pl.comp.lang.python Subject: Re: odwolywanie sie w funckji do tej samej funkcji Date: Thu, 28 Jan 2010 15:54:17 +0100 Organization: TP - http://www.tp.pl/ Lines: 171 Message-ID: <pth837-dcp.ln1@bozon.softax.pl> References: <546bbaa8-dce5-4be1-a4ef-26cd9be394d3@p24g2000yqm.googlegroups.com> NNTP-Posting-Host: 83.18.189.42 Mime-Version: 1.0 X-Trace: atlantis.news.neostrada.pl 1264688253 25552 83.18.189.42 (28 Jan 2010 14:17:33 GMT) X-Complaints-To: usenet@news.neostrada.pl NNTP-Posting-Date: Thu, 28 Jan 2010 14:17:33 +0000 (UTC) User-Agent: Thunderbird 2.0.0.23 (X11/20090817) In-Reply-To: <546bbaa8-dce5-4be1-a4ef-26cd9be394d3@p24g2000yqm.googlegroups.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit