🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.python
Article #27280

Re: odwolywanie sie w funckji do tej samej funkcji

#27280
From: Sebastian Kaliszewski
Date: Thu, 28 Jan 2010 14:54
171 lines
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!news
References: <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