{"id":8263,"date":"2014-09-27T19:09:36","date_gmt":"2014-09-27T23:09:36","guid":{"rendered":"http:\/\/cscircles.cemc.uwaterloo.ca\/?page_id=8263"},"modified":"2014-11-11T17:35:45","modified_gmt":"2014-11-11T22:35:45","slug":"11b-kintamuju-galiojimo-sritis","status":"publish","type":"page","link":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/11b-kintamuju-galiojimo-sritis\/","title":{"rendered":"11: Lokal\u016bs ir global\u016bs kintamieji"},"content":{"rendered":"<p>Programos yra skaidomos \u012f dalis, kad b\u016bt\u0173\u00a0lengviau tvarkomos, pvz, \u012f keils failus, arba faile kodas b\u016bna suskaidytas \u012f\u00a0 funkcijas. Skirtingose programos dalyse gali pasitaikyti vienodai pavadint\u0173 kintam\u0173j\u0173 (kaip kad skirtingose \u0161eimose b\u016bna vaik\u0173 tais pa\u010diais vardais) - jie tarpusavy nesimai\u0161o, nes naudojami tik tos dalies viduje - <strong>lokaliai<\/strong>. O kai kurie kintamieji gali b\u016bti \u017einomi visoje programoje - <strong>globaliai<\/strong> (kaip kokie visuomen\u0117s veik\u0117jai ar pop. \u017evaig\u017ed\u0117s).<\/p>\n<h2>Kintam\u0173j\u0173 galiojimo sritis<\/h2>\n<pre>def square(x):\r\n \u00a0 value = x * x\r\n \u00a0 return value<\/pre>\u0160i funkcija skai\u010diuoja skai\u010diaus <code>x<\/code> kvadrat\u0105. Tarkime, kad funkcij\u0105 <code>square<\/code> i\u0161kviesime i\u0161 programos, kurioje taip pat yra <code>value<\/code> kintamasis, ta\u010diau naudojamas kitais tikslais.<\/p>\n<pre># pagrindin\u0117 programa\r\nvalue = 17\r\npenki_kvadratu = square(5)\r\nprint(penki_kvadratu, value)<\/pre>Kaip manote, kas bus atspausdinta? Ne\u017einodami kaip Pitonas elgsis, galime svarstyti dvi galimybes:<\/p>\n<ol>\n<li>Arba Pitone yra du atskiri <code>value<\/code> kintamieji (vienas funkcijoje \"square\", kitas - u\u017e jos rib\u0173 ). Taigi, <code>square<\/code> gr\u0105\u017eins 25, bet <code>value<\/code> reik\u0161m\u0117 pagrindin\u0117je programoje i\u0161liks 17. Bus atspausdinama: <code>25 <\/code><code>17<\/code>.<\/li>\n<li>Arba visur yra tas pats kintamasis <code>value<\/code>. Funkcija <code>square<\/code> pakei\u010dia <code>value<\/code> reik\u0161m\u0119, taigi programa atspausdins: <code>25 <\/code><code>25<\/code>.<\/li>\n<\/ol>\n<p>O kaip yra i\u0161 tikro?<\/p>\n<p><iframe width='100%' height='480' frameborder='0' scrolling='no' src='https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-content\/plugins\/pybox\/OnlinePythonTutor3-cemc\/iframe-embed.html#code=def+square%28x%29%3A%0A+++value+%3D+x+%2A+x%0A+++return+value%0A%0A%23+pagrindin%C4%97+programa+%0Avalue+%3D+17+%0Apenki_kvadratu+%3D+square%285%29+%0Aprint%28penki_kvadratu%2C+value%29&cumulative=false&heapPrimitives=false&drawParentPointers=false&textReferences=false&showOnlyOutputs=false&py=3&curInstr=0&resizeContainer=true&highlightLines&width=450&rightStdout=1'><\/iframe><\/p>\n<p>Matome, jog Pitonas veikia pagal pirm\u0105j\u012f variant\u0105.\u00a0 <em>Vykdant funkcij\u0105, Pitonas nepakei\u010dia kintam\u0173j\u0173, esan\u010di\u0173 u\u017e jos rib\u0173.<\/em> Priskyrimo veiksmai pakei\u010dia tik \u201clokalius\" kintamuosius - esan\u010dius funkcijos viduje. Tai nat\u016braliai apsaugo nuo netik\u0117t\u0173 nesusipratim\u0173 (pvz., jei kelios funkcijos naudot\u0173 t\u0105 pat\u012f kintamojo vard\u0105).<\/p>\n<p>Detaliau tai galite pamatyti 6-tame \u017eingsnyje (\"<span id=\"curInstr\">Step 6 of 8<\/span>\"): matosi du skirtingi kintamieji <code>value<\/code>: vienas <code>square<\/code> funkcijoje, o kitas u\u017e funkcijos rib\u0173 - \u201cglobalioje\u201d programos srityje.<\/p>\n<div class='pybox modeNeutral' id='pybox0'>\n<img title='You have not yet completed this problem.' src='https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-content\/plugins\/pybox\/files\/icon.png' class='pycheck'\/><div class=\"heading\"><span class='type'>Multiple Choice Exercise: <\/span><span class='title'>Vidus ir i\u0161or\u0117<\/span><\/div><div>K\u0105 atspausdins \u0161i programa?<\/p>\n<pre>x = \"outer\"\r\ndef xReplace(value):\r\n \u00a0 x = value\r\n\r\nxReplace(\"inner\")\r\nprint(x)<\/pre><\/div><label>Your choice: <\/label><select id=\"pyselect0\"><option value=\"d\" selected>Select one<\/option><option value=\"r\">outer<\/option><option value=\"w\">inner<\/option><option value=\"w\">programa \"nulu\u0161\"<\/option><\/select><div class='pyboxbuttons'><input type=\"hidden\" name=\"lang\" value=\"\"\/><input type=\"hidden\" name=\"slug\" value=\"11b.inout\"\/><input type='submit' style='margin:5px;' value='Check answer' onClick='pbMultiCheck(0)'\/><\/div><div class=\"pbresults\" id=\"pyMultiResults0\"><\/div><div class=\"epilogue\">Teisingai! \u0160is sakinys\/teiginys <code>x = value<\/code> veikia tiktai viduje esant\u012f kintamaj\u012f <code>x<\/code>. I\u0161or\u0117je esantis globalus kintamasis <code>x<\/code> nebuvo pakeistas. (taigi, funkcija <code>xReplace<\/code> yra bevert\u0117.)<\/div><\/div>\n<p>\u012e kintam\u0173j\u0173 galijimo sri\u012f (\"<em>variable scope<\/em>\") pana\u0161i s\u0105voka yra \"<em>namespace\"<\/em> (vard\u0173 galiojimo sritis)<em>.<\/em> Jos pagalba nurodoma, kad kintamasis yra i\u0161 konkre\u010dios programos dalies -- i\u0161 ka\u017ekurio importuoto modulio. Pvz., jei <a href=\"http:\/\/ims.mii.lt\/EK%C5%BD\/enciklo.html?word=importuoti\">importuojame<\/a> paket\u0105\u00a0 <code>math<\/code>, kuriame yra kintam\u0105sis\u00a0 <code>x<\/code>, jis nepersidengia su m\u016bs\u0173 programos kintamuoju <code>x<\/code>, nes pasiekiamas \u201eper ta\u0161k\u0105\u201c <code>math.x<\/code><\/p>\n<h2>Sri\u010di\u0173 taisykl\u0117: pirmiau \u017ei\u016brim viduje, o paskui - i\u0161or\u0117n<\/h2>\n<p>Kartais prireikia funkcijos viduje panaudoti globalius kintamuosius. Pvz., programos prad\u017eioje priskiriame kintamajam reik\u0161m\u0119, ir norime, kad m\u016bs\u0173 funkcijos j\u0105 \u017einot\u0173 - matyt\u0173.<\/p>\n<p><form class=\"pbform\" action=\"#\" id=\"pbform1\" method=\"POST\">\n<div class='pybox modeNeutral  facultative' id='pybox1'>\n<div class=\"heading\"><span class=\"title\">Example<\/span><\/div> Kaip i\u0161 funkcijos perskaityti global\u0173 kintamaj\u012f?<div class='pyboxTextwrap pyboxCodewrap RO '  style='height: 110px;'><textarea wrap='off' name='usercode1' id='usercode1'  cols=10 rows=4 readonly='readonly'  style = 'height : 110px;'  class='pyboxCode RO'>\nfavouriteTopping='pepperoni'\ndef orderPizzas(n):\n   print(\"I'd like\", str(n), favouriteTopping, \"pizzas\")\norderPizzas(3)<\/textarea><\/div>\n<div id='pbhistory1' class='flexcontain' style='display:none;'><\/div>\n<div class='pyboxbuttons'><table><tr>\n<td><input type='submit' name='submit' id='submit1' value=' '\/><\/td>\n<td><input type='button' name='consolecopy' value=\"Open in console\" onclick=\"pbConsoleCopy(1)\" ><\/td>\n<td><input type='button' name='visualize' value=\"Visualize\" onclick=\"pbVisualize(1,'N')\" ><\/td>\n<\/tr><\/table><\/div>\n<input type=\"hidden\" name=\"lang\" value=\"\"\/><input type=\"hidden\" id=\"inputInUse1\" name=\"inputInUse\" value=\"Y\"\/>\n<input type=\"hidden\" name=\"pyId\" value=\"1\"\/>\n<input type=\"hidden\" name=\"hash\" value=\"ebcc525a96b4049fa07a711b4c4a3ea4\"\/>\n<div id='pbresults1' class='pbresults'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>document.getElementById(\"submit1\").value = \"Run program\";document.getElementById(\"inputInUse1\").value = \"N\";<\/script>\n<\/p>\n<p>Funkcijoje nebuvo kintamojo <code>favouriteTopping<\/code>, <em>ta\u010diau klaida ne\u012fvyko<\/em>. Pitonas kintamuosius per\u017ei\u016bri pagal toki\u0105 tvark\u0105: <strong>vis\u0173 pirma<\/strong> ie\u0161ko lokalaus kintamojo, o<strong> po to<\/strong> -- globaliai galiojan\u010dio. M\u016bs\u0173 atveju programa rado <code>favouriteTopping<\/code> globalioje srityje.<\/p>\n<p><table class='pywarn'><tr><td class='pywarnleft'><img src='https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-content\/plugins\/pybox\/files\/warning.png'\/><\/td><td class='pywarnright'><span> Auk\u0161\u010diau esantys pavyzd\u017eiai su <code>orderPizzas<\/code> ir <code>xReplace<\/code> yra beveik identi\u0161ki. Kod\u0117l \u00a0<code>xReplace<\/code> kintamasis <code>x<\/code> yra lokalus, o <code>orderPizzas<\/code> atveju <code>favouriteTopping<\/code> - lieka globalus? Pitone galioja taisykl\u0117: <strong>jei funkcijoje kintamajam priskiriama reik\u0161m\u0117, tai jis standarti\u0161kai padaromas lokaliu<\/strong> (kad neb\u016bt\u0173 konflikt\u0173 su kitom programos dalimis). Tai pati da\u017eniausia prie\u017eastis klaidos: <a href=\"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/console\/?consolecode=x%20%3D%201%0Adef%20f%28%29%3A%0A%20%20%20print%28x%29%0A%20%20%20x%20%3D%202%0Af%28%29\" target=\"_blank\"><code>UnboundLocalError<\/code><\/a>: daugiau apie tai [<a href=\"http:\/\/docs.python.org\/py3k\/faq\/programming.html#why-am-i-getting-an-unboundlocalerror-when-the-variable-has-a-value\" target=\"_blank\">1<\/a>, <a href=\"http:\/\/docs.python.org\/py3k\/faq\/programming.html#what-are-the-rules-for-local-and-global-variables-in-python\" target=\"_blank\">2<\/a>] oficialioje Pitono dokumentacijoje. <\/span><\/td><\/table><\/p>\n<p>Funkcijos argumentai yra visada laikomi naujais lokaliais kintamaisiais. Tai pailiustruoja \u0161is neveikiantis kodas ( jis bando kintam\u0105jam <code>g<\/code> priskirti reik\u0161m\u0119 <code>0<\/code>).<\/p>\n<p><iframe width='100%' height='480' frameborder='0' scrolling='no' src='https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-content\/plugins\/pybox\/OnlinePythonTutor3-cemc\/iframe-embed.html#code=def+resetToZero%28var%29%3A%0A+var+%3D+0%0Ag+%3D+15%0AresetToZero%28g%29%0Aprint%28g%29&cumulative=false&heapPrimitives=false&drawParentPointers=false&textReferences=false&showOnlyOutputs=false&py=3&curInstr=0&resizeContainer=true&highlightLines&width=400&rightStdout=1'><\/iframe><\/p>\n<p>Situacija su kintam\u0173j\u0173 galiojimo sritimi galima palyginti su gyventoj\u0173 vie\u0161a ir priva\u010dia erdve: tai, kas vie\u0161a (globalu) - \u017einoma visiems, o kas privatu (lokalu) - ne\u017einoma u\u017e namo sien\u0173.<\/p>\n<h2><code>global<\/code>'\u016bs pakeitimai<\/h2>\n<p>Auk\u0161\u010diau apra\u0161ytas princiapas tinka 99% atvej\u0173. Ta\u010diau, kartais patogu global\u0173 kintam\u0105j\u012f pakeisti funkcijos viduje. Tai galima padaryti naudojant rakta\u017eod\u012f <code>global<\/code> .<\/p>\n<p>\u0160tai auk\u0161\u010diau buvusio <code>xReplace<\/code> modifikacija: nurod\u017eius, kad kintamasis yra <code>global<\/code>'us, jo reik\u0161m\u0117 pakei\u010diama i\u0161 \"outer\" \u012f \"inner\":<\/p>\n<p><iframe width='100%' height='480' frameborder='0' scrolling='no' src='https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-content\/plugins\/pybox\/OnlinePythonTutor3-cemc\/iframe-embed.html#code=def+xReplace%28value%29%3A%0A++++global+x%0A++++x+%3D+value%0A%0Ax+%3D+%22outer%22%0AxReplace%28%22inner%22%29+%0Aprint%28x%29+++++++%23+%27inner%27+now%21&cumulative=false&heapPrimitives=false&drawParentPointers=false&textReferences=false&showOnlyOutputs=false&py=3&curInstr=0&resizeContainer=true&highlightLines&width=400&rightStdout=1'><\/iframe><\/p>\n<p>Kaip jau min\u0117jome, norint <em>panaudoti<\/em> globalaus kintamojo <em>reik\u0161m\u0119<\/em>, nereikia naudoti <code>global<\/code>. Jis naudojamas tik norint <em>priskirti\/pakeisti<\/em> reik\u0161mes.<\/p>\n<p>P.s.: 13 pamokoje i\u0161moksite apie s\u0105ra\u0161us -- j\u0173 pertvarkymus funkcijojse galima daryti be <code>global<\/code>, ir jie i\u0161liks, nes s\u0105ra\u0161\u0173 saugojimas atmintyje \u012fdomesnis negu paprast\u0173 kintam\u0173j\u0173 ;).<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Programos yra skaidomos \u012f dalis, kad b\u016bt\u0173\u00a0lengviau tvarkomos, pvz, \u012f keils failus, arba faile kodas b\u016bna suskaidytas \u012f\u00a0 funkcijas. Skirtingose programos dalyse gali pasitaikyti vienodai pavadint\u0173 kintam\u0173j\u0173 (kaip kad skirtingose \u0161eimose b\u016bna vaik\u0173 tais pa\u010diais vardais) - jie tarpusavy nesimai\u0161o, &hellip; <a href=\"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/11b-kintamuju-galiojimo-sritis\/\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-8263","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages\/8263","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/comments?post=8263"}],"version-history":[{"count":8,"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages\/8263\/revisions"}],"predecessor-version":[{"id":8735,"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages\/8263\/revisions\/8735"}],"wp:attachment":[{"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/media?parent=8263"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}