{"id":10004,"date":"2017-05-18T02:11:16","date_gmt":"2017-05-18T06:11:16","guid":{"rendered":"https:\/\/cscircles.cemc.uwaterloo.ca\/?page_id=10004"},"modified":"2017-08-13T11:09:01","modified_gmt":"2017-08-13T15:09:01","slug":"17-pl","status":"publish","type":"page","link":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/17-pl\/","title":{"rendered":"17: Is"},"content":{"rendered":"<!-- Please retain this notice and add more notes if you create a new version.<br \/>\nOriginal lesson author: David Pritchard, daveagp@gmail.com, http:\/\/cscircles.ca<br \/>\nPolish translator: Marzanna Mi\u0105sko, miasko.marzanna@gmail.com<br \/>\nLicense: http:\/\/creativecommons.org\/licenses\/by-nc-sa\/3.0\/-->\n<p>W tej lekcji podajemy szczeg\u00f3\u0142y dotycz\u0105ce sposobu przechowywania list w Pythonie. Kopiowanie i por\u00f3wnywanie list mo\u017ce mie\u0107 nieoczekiwane konsekwencje. Wyja\u015bnimy, jak Python dzia\u0142a wewn\u0119trznie, aby\u015b m\u00f3g\u0142 zrozumie\u0107 i unika\u0107 tych b\u0142\u0119d\u00f3w. Og\u00f3lnie rzecz bior\u0105c, kilka r\u00f3\u017cnych zmiennych mo\u017ce \"wskazywa\u0107\" lub \"odwo\u0142ywa\u0107 si\u0119 do\" tej samej listy. Pod koniec lekcji opisujemy operator \"is\", kt\u00f3ry m\u00f3wi, czy dwie zmienne naprawd\u0119 <em>wskazuj\u0105<\/em> dok\u0142adnie t\u0119 sam\u0105 list\u0119.<\/p>\n<h1>Przyk\u0142ad<\/h1>\n<p>Za\u0142\u00f3\u017cmy, \u017ce chcemy przekonwertowa\u0107 fragment kodu: list\u0119 d\u0142ugo\u015bci okre\u015blon\u0105 w calach o nazwie <code>oldSize<\/code> na list\u0119 o tej samej d\u0142ugo\u015bci w centymetrach o nazwie <code>newSize<\/code>. Jednym ze sposob\u00f3w, kt\u00f3rym spr\u00f3bujemy to zrobi\u0107, jest u\u017cycie wiersza <code>newSize = oldSize<\/code> do wykonania kopii, a nast\u0119pnie przej\u015bcie przez wszystkie warto\u015bci w celu ich zmiany:<\/p>\n<pre>oldSize = [\"letter\", 8.5, 11] \u00a0 # rozmiar papieru w calach\r\nnewSize =\u00a0oldSize \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 # kopiowanie?\r\nnewSize[1] = newSize[1]*2.54 \u00a0 \u00a0# zamiana na centymetry\r\nnewSize[2] = newSize[2]*2.54 \u00a0 \u00a0#zamiana na centymetry<\/pre>Teraz sp\u00f3jrzmy, czy to dzia\u0142a. Je\u015bli drukujesz <code>newSize<\/code>, to zgodnie z oczekiwaniami otrzymujemy  <code>[\"letter\", 21.59, 27.94]<\/code>. Wa\u017cne jest to, \u017ce podczas drukowania <code>oldSize<\/code> zmieni\u0142y si\u0119 warto\u015bci <code>oldSize<\/code>! Ilustrujemy to poni\u017cej:<\/p>\n<p><form class=\"pbform\" action=\"#\" id=\"pbform0\" method=\"POST\">\n<div class='pybox modeNeutral  facultative' id='pybox0'>\n<div class=\"heading\"><span class=\"title\">Example<\/span><\/div>Druga linia wyj\u015bcia nie jest tym, czego si\u0119 spodziewamy!<div class='pyboxTextwrap pyboxCodewrap RO '  style='height: 162px;'><textarea wrap='off' name='usercode0' id='usercode0'  cols=10 rows=6 readonly='readonly'  style = 'height : 162px;'  class='pyboxCode RO'>\noldSize = [\"letter\", 8.5, 11]   # rozmiar papieru w centymetrach\nnewSize = oldSize               # tworzy kopi\u0119?\nnewSize[1] = newSize[1]*2.54    # konwersja na cm\nnewSize[2] = newSize[2]*2.54    # konwersja to cm\nprint(newSize)                  # zgodnie z oczekiwaniami, drukuje [\"letter\", 21.59, 27.94]\nprint(oldSize)                  # nie zgodnie z oczekiwaniami, numery zosta\u0142y zmienione [\"letter\", 8.5, 11]...<\/textarea><\/div>\n<div id='pbhistory0' class='flexcontain' style='display:none;'><\/div>\n<div class='pyboxbuttons'><table><tr>\n<td><input type='submit' name='submit' id='submit0' value=' '\/><\/td>\n<td><input type='button' name='consolecopy' value=\"Open in console\" onclick=\"pbConsoleCopy(0)\" ><\/td>\n<td><input type='button' name='visualize' value=\"Visualize\" onclick=\"pbVisualize(0,'N')\" ><\/td>\n<\/tr><\/table><\/div>\n<input type=\"hidden\" name=\"lang\" value=\"\"\/><input type=\"hidden\" id=\"inputInUse0\" name=\"inputInUse\" value=\"Y\"\/>\n<input type=\"hidden\" name=\"pyId\" value=\"0\"\/>\n<input type=\"hidden\" name=\"hash\" value=\"0cf734804586476ae6db6f0caa2c91ec\"\/>\n<div id='pbresults0' class='pbresults'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>document.getElementById(\"submit0\").value = \"Run program\";document.getElementById(\"inputInUse0\").value = \"N\";<\/script>\n<\/p>\n<p>Dok\u0142adnie wyja\u015bnimy, co si\u0119 sta\u0142o, u\u017cywaj\u0105c diagram\u00f3w. G\u0142\u00f3wnym problemem jest to, \u017ce <code>newSize = oldSize<\/code> nie skopiowa\u0142 ca\u0142ej listy: po prostu skopiowa\u0142 <em>odno\u015bnik <\/em>(strza\u0142k\u0119) do tej samej listy.<\/p>\n<p><em>Klikaj tytu\u0142y, aby zmienia\u0107 zak\u0142adki.<\/em><\/p>\n<div class=\"accordion\"><br \/>\n<div class='collapseContain showing'>\n<div class='collapseHead'><span class='icon'><\/span>\nMemory\n<\/div>\n<div class='collapseBody'>U\u017cyjemy tabeli do zaprezentowania zmiennych i warto\u015bci w pami\u0119ci Pythona. Na przyk\u0142ad po uruchomieniu kodu<\/p>\n<pre>city = \"Moose Factory\"\r\npopulation = 2458\r\nemployer = city<\/pre>tabela (z czarn\u0105 ramk\u0105) pokazuje, jak wygl\u0105da pami\u0119\u0107 Pythona:<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone\" src=\"..\/wp-content\/lesson_files\/img\/17\/slide1.png\" alt=\"\" width=\"480\" height=\"168\" \/><br\/>Pierwsza nazwa zmiennej to <code>city<\/code>, a jej warto\u015bci\u0105 jest ci\u0105g <code>\"Moose Factory\"<\/code>. Drug\u0105 nazw\u0105 zmiennej jest <code>population<\/code>, a jej warto\u015bci\u0105 jest liczba ca\u0142kowita <code>2458<\/code>. Nazwa trzeciej zmiennej to <code>employer<\/code>, a jej warto\u015bci\u0105 jest \u0142a\u0144cuch <code>\"Moose Factory\"<\/code><\/div><\/div><div class='collapseContain hiding'>\n<div class='collapseHead'><span class='icon'><\/span>\nListy w pami\u0119ci\n<\/div>\n<div class='collapseBody'>Teraz poka\u017cemy, jak wygl\u0105da <em>lista<\/em> w pami\u0119ci. Na przyk\u0142ad, pobierz fragment kodu<\/p>\n<pre>myList = [\"Moose Factory\", 2458]<\/pre>Po prostu utworzymy jedn\u0105 zmienn\u0105 o nazwie <code>myList<\/code>. Lista zosta\u0142a utworzona, a warto\u015bci <code>myList<\/code> \"odwo\u0142uj\u0105 si\u0119\" lub  \"wskazuj\u0105\" na t\u0105 list\u0119. Reprezentujemy list\u0119 u\u017cywaj\u0105c pola, a warto\u015bci listy s\u0105 wy\u015bwietlane wewn\u0105trz pola obok odpowiadaj\u0105cych im indeks\u00f3w. Lista jest wy\u015bwietlana na niebiesko.<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone\" src=\"..\/wp-content\/lesson_files\/img\/17\/slide2.png\" alt=\"\" width=\"702\" height=\"168\" \/><br\/>Strza\u0142ka wskazuje, \u017ce <code>myList<\/code> odnosi si\u0119 do tej nowej listy. Elementem o indeksie 0 to \u0142a\u0144cuch  <code>\"Moose Factory\"<\/code>, a elementem o indeksie 1 to liczba ca\u0142kowita <code>2458<\/code>. Na przyk\u0142ad, je\u015bli wywo\u0142asz <code>print(myList[1])<\/code>, Python wyprowadzi <code>2458<\/code>.<\/div><\/div><div class='collapseContain hiding'>\n<div class='collapseHead'><span class='icon'><\/span>\nZmiana warto\u015bci listy \n<\/div>\n<div class='collapseBody'>Teraz, tylko dla cel\u00f3w ilustracyjnych, dodajemy jeszcze jedn\u0105 lini\u0119 do poprzedniego przyk\u0142adu. Dziecko rodzi si\u0119, wi\u0119c uruchamiamy fragment kodu<\/p>\n<pre>myList = [\"Moose Factory\", 2458]\r\nmyList[1] = myList[1]+1<\/pre>Python oblicza <code>2458+1<\/code> co jest r\u00f3wne <code>2459<\/code>, a to zast\u0119puje warto\u015b\u0107 o indeksie 1 listy. Po aktualizacji mamy diagram przedstawiony poni\u017cej.<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone\" src=\"..\/wp-content\/lesson_files\/img\/17\/slide3.png\" alt=\"\" width=\"702\" height=\"168\" \/><br\/>(Przekre\u015blone\u00a0<span style=\"text-decoration: line-through;\">2458<\/span>\u00a0jest tylko po to widoczne, aby podkre\u015bli\u0107 zmian\u0119.)<\/div><\/div><div class='collapseContain hiding'>\n<div class='collapseHead'><span class='icon'><\/span>\n<code>oldSize<\/code> i <code>newSize<\/code>\n<\/div>\n<div class='collapseBody'>Teraz wracamy do g\u0142\u00f3wnego przyk\u0142adu. Pierwsza linia by\u0142a<\/p>\n<pre>oldSize = [\"letter\", 8.5, 11]<\/pre>a wi\u0119c, po wykonaniu tej linii, pami\u0119\u0107 Pythona wygl\u0105da jak diagram poni\u017cej. Utworzyli\u015bmy list\u0119 d\u0142ugo\u015bci 3.<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone\" src=\"..\/wp-content\/lesson_files\/img\/17\/slide4.png\" alt=\"\" width=\"702\" height=\"168\" \/><\/div><\/div><div class='collapseContain hiding'>\n<div class='collapseHead'><span class='icon'><\/span>\nG\u0142\u00f3wny problem\n<\/div>\n<div class='collapseBody'>W naszym programie druga linia to<\/p>\n<pre>newSize = oldSize<\/pre>A najwa\u017cniejszy punkt tej lekcji jest tutaj: <strong><code>=<\/code> nie duplikuje listy!<\/strong> Zamiast tego tworzy nowe odwo\u0142anie do tej <strong>samej<\/strong> listy. Ilustruj\u0105 to dwie r\u00f3\u017cne strza\u0142y wskazuj\u0105ce na dok\u0142adnie to <strong>samo<\/strong> pole.<img loading=\"lazy\" decoding=\"async\" class=\"alignnone\" src=\"..\/wp-content\/lesson_files\/img\/17\/slide5.png\" alt=\"\" width=\"702\" height=\"168\" \/><br\/>Jak pokazuje wykres, mamy dwie zmienne, kt\u00f3re odnosz\u0105 si\u0119 do tej samej listy.<\/div><\/div><div class='collapseContain hiding'>\n<div class='collapseHead'><span class='icon'><\/span>\nUaktualnienie\n<\/div>\n<div class='collapseBody'>Nast\u0119pnie, gdy program osi\u0105gnie lini\u0119<\/p>\n<pre>newSize[1] = newSize[1]*2.54<\/pre>Python wyszukuje <code>nowySize<\/code>, wyszukuje warto\u015b\u0107 indeksu 1 (8.5) i mno\u017cy go przez 2,54, a nast\u0119pnie, jak pokazano, zast\u0119puje warto\u015b\u0107. Poniewa\u017c <code>oldSize<\/code> odwo\u0142uje si\u0119 do tej samej listy, efektem ubocznym jest to, \u017ce wp\u0142ywali\u015bmy tak\u017ce na to, do czego odwo\u0142ywa\u0142o si\u0119 <code>oldSiz<\/code>e!<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone\" src=\"..\/wp-content\/lesson_files\/img\/17\/slide6.png\" alt=\"\" width=\"702\" height=\"168\" \/><br\/>(Ponownie <span style=\"text-decoration: line-through;\">8.5<\/span>\u00a0pokazano tylko po to, aby podkre\u015bli\u0107 zmian\u0119.)<\/div><\/div><div class='collapseContain hiding'>\n<div class='collapseHead'><span class='icon'><\/span>\nRezultat\n<\/div>\n<div class='collapseBody'>Nast\u0119pna linia jest podobna,<\/p>\n<pre>newSize[2] = newSize[2]*2.54<\/pre>co ma wp\u0142yw na inn\u0105 warto\u015b\u0107 na li\u015bcie. Po wykonaniu tej linii pami\u0119\u0107 Pythona wygl\u0105da jak pokazano na diagramie poni\u017cej.<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone\" src=\"..\/wp-content\/lesson_files\/img\/17\/slide7.png\" alt=\"\" width=\"702\" height=\"168\" \/><br\/>Teraz, gdy drukujemy  <code>newSize<\/code> <strong>o lub <\/strong> <code>oldSize<\/code>, Python wyprowadza <code>[\"letter\", 21.59, 27.94]<\/code>.<\/div><\/div><\/div><br \/>\n<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> Aby zobaczy\u0107 rysunki bez komentarza, <a href=\"http:\/\/cscircles.cemc.uwaterloo.ca\/visualize\/#code=oldSize%20%3D%20%5B%22letter%22%2C%208.5%2C%2011%5D%20%20%20%23%20size%20of%20paper%20in%20inches%0AnewSize%20%3D%20oldSize%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20make%20a%20copy%0AnewSize%5B1%5D%20%3D%20newSize%5B1%5D*2.54%20%20%20%20%23%20convert%20to%20cm%0AnewSize%5B2%5D%20%3D%20newSize%5B2%5D*2.54%20%20%20%20%23%20convert%20to%20cm%0Aprint(newSize)%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20as%20expected%2C%20prints%20%5B%22letter%22%2C%2021.59%2C%2027.94%5D%0Aprint(oldSize)%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20surprise!%20DOES%20NOT%20print%20%5B%22letter%22%2C%208.5%2C%2011%5D\">uruchom ten sam kod w wizualizatorze<\/a>. <\/span><\/td><\/table><\/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> W\u0142a\u015bciwie <em>ka\u017cda<\/em> warto\u015b\u0107 w Pythonie jest obiektem \u017cyj\u0105cym w konkretnym fragmencie pami\u0119ci, a <em>ka\u017cda<\/em> zmienna jest tylko odno\u015bnikiem\/wska\u017anikiem\/strza\u0142k\u0105. Na przyk\u0142ad, w pierwszym slajdzie pami\u0119\u0107 zawiera jedn\u0105 \"Moose Factory\" z prowadz\u0105cymi do niej dwiema strza\u0142kami. Poniewa\u017c liczba i obiekty \u0142a\u0144cucha s\u0105 \"niezmienne\", rysujemy je bez strza\u0142ek w tych lekcjach, ale one s\u0105 za kulisami, Python traktuje wszystkie dane jednolicie. <a href=\"http:\/\/www.greenteapress.com\/thinkpython\/html\/thinkpython011.html\">Czytaj wi\u0119cej tutaj<\/a>. <\/span><\/td><\/table><\/p>\n<h1>\"Deep\"\u00a0Kopiowanie List w Pythonie<\/h1>\n<p>W powy\u017cszym przyk\u0142adzie u\u017cywamy <code>=<\/code> aby utworzy\u0107 drugi wska\u017anik\/odno\u015bnik\/strza\u0142k\u0119 do istniej\u0105cej listy, kt\u00f3ra zwykle nazywa si\u0119 \"p\u0142ytk\u0105\" kopi\u0105. Chocia\u017c, to jest <a class=\"hintlink\"  id=\"hintlink1\">czasami przydatne<\/a>, to nie jest jednak to, czego chcieli\u015bmy. Zamiast tego chcieli\u015bmy stworzy\u0107 zupe\u0142nie now\u0105 kopi\u0119 tej listy. Jak to zrobi\u0107?<br \/>\nPodamy trzy rozwi\u0105zania. Prawie wszystkie s\u0105 r\u00f3wnowa\u017cne, ale ka\u017cde z nich nauczy ci\u0119 nowego faktu o Pythonie, wi\u0119c wszystkie trzy s\u0105 warte przeczytania.<\/p>\n<h2>Metoda 1, u\u017cycie <code>[:]<\/code><\/h2>\n<p><form class=\"pbform\" action=\"#\" id=\"pbform2\" method=\"POST\">\n<div class='pybox modeNeutral  facultative' id='pybox2'>\n<div class=\"heading\"><span class=\"title\">Example<\/span><\/div>Kopiowanie z u\u017cyciem <code>[:]<\/code><div class='pyboxTextwrap pyboxCodewrap RO '  style='height: 110px;'><textarea wrap='off' name='usercode2' id='usercode2'  cols=10 rows=4 readonly='readonly'  style = 'height : 110px;'  class='pyboxCode RO'>\noldList = [\"first\", \"second\", \"third\"]\nnewList = oldList[:]     # tworzy kopi\u0119\noldList.reverse()\nprint(newList, oldList)<\/textarea><\/div>\n<div id='pbhistory2' class='flexcontain' style='display:none;'><\/div>\n<div class='pyboxbuttons'><table><tr>\n<td><input type='submit' name='submit' id='submit2' value=' '\/><\/td>\n<td><input type='button' name='consolecopy' value=\"Open in console\" onclick=\"pbConsoleCopy(2)\" ><\/td>\n<td><input type='button' name='visualize' value=\"Visualize\" onclick=\"pbVisualize(2,'N')\" ><\/td>\n<\/tr><\/table><\/div>\n<input type=\"hidden\" name=\"lang\" value=\"\"\/><input type=\"hidden\" id=\"inputInUse2\" name=\"inputInUse\" value=\"Y\"\/>\n<input type=\"hidden\" name=\"pyId\" value=\"2\"\/>\n<input type=\"hidden\" name=\"hash\" value=\"b3199771094605b406eeb1b3b8d4bcf3\"\/>\n<div id='pbresults2' class='pbresults'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>document.getElementById(\"submit2\").value = \"Run program\";document.getElementById(\"inputInUse2\").value = \"N\";<\/script>\n<\/p>\n<p>Powy\u017cej demonstrujemy, \u017ce <code>newList = oldList[:]<\/code> tworzy prawdziw\u0105 kopi\u0119 starej listy. Cho\u0107 ta sk\u0142adnia wygl\u0105da dziwnie, jest to podobne do tego, co ju\u017c widzieli\u015bmy. W <a href=\"\/7a-pl\/\">lekcji o \u0142a\u0144cuchach<\/a> wprowadzili\u015bmy spos\u00f3b wyodr\u0119bniania pod\u0142a\u0144cucha: code>string[pierwszy:ostatni]<\/code> zwraca \u0142a\u0144cuch znak\u00f3w wyj\u015bciowych zaczynaj\u0105c od indeksu <code>pierwszy<\/code> i ko\u0144cz\u0105c na indeksie <code>ostatni-1<\/code>. Wspomnieli\u015bmy, \u017ce mo\u017ce to mie\u0107 zastosowanie do tworzenia podlist list. Dodatkowo,<\/p>\n<ul>\n<li>je\u015bli pominiesz <code>pierwszy<\/code>, wtedy przyjmuje domy\u015bln\u0105 warto\u015b\u0107 <code>0<\/code>;<\/li>\n<li>je\u015bli pominiesz <code>ostatni<\/code>, wtedy przyjmuje domy\u015bln\u0105 warto\u015b\u0107 <code>len<\/code>\u00a0(d\u0142ugo\u015b\u0107 listy\/\u0142a\u0144cucha).<\/li>\n<\/ul>\n<p>Wi\u0119c starsza <code>oldList[:]<\/code> tworzy now\u0105 podlist\u0119, ale zawiera wszystkie te same dane, co oryginalna lista, wi\u0119c jest to nowa kopia.<\/p>\n<h2>Metoda 2, u\u017cycie <code>copy.copy()<\/code><\/h2>\n<p>Jest to znany modu\u0142 <code>copy<\/code>, kt\u00f3ry zawiera kilka metod kopiowania. Najprostszym jest <code>copy.copy(L)<\/code>: gdy wywo\u0142ujesz na li\u015bcie <code>L<\/code>, funkcja zwraca prawdziw\u0105 kopi\u0119 <code>L<\/code>.<\/p>\n<p><form class=\"pbform\" action=\"#\" id=\"pbform3\" method=\"POST\">\n<div class='pybox modeNeutral  facultative' id='pybox3'>\n<div class=\"heading\"><span class=\"title\">Example<\/span><\/div>Kopiowanie z u\u017cyciem\u00a0<code>copy.copy<\/code><div class='pyboxTextwrap pyboxCodewrap RO '  style='height: 136px;'><textarea wrap='off' name='usercode3' id='usercode3'  cols=10 rows=5 readonly='readonly'  style = 'height : 136px;'  class='pyboxCode RO'>\nimport copy\noldList = [\"first\", \"second\", \"third\"]\nnewList = copy.copy(oldList)     # tworzy kopi\u0119\noldList.reverse()\nprint(newList, oldList)<\/textarea><\/div>\n<div id='pbhistory3' class='flexcontain' style='display:none;'><\/div>\n<div class='pyboxbuttons'><table><tr>\n<td><input type='submit' name='submit' id='submit3' value=' '\/><\/td>\n<td><input type='button' name='consolecopy' value=\"Open in console\" onclick=\"pbConsoleCopy(3)\" ><\/td>\n<td><input type='button' name='visualize' value=\"Visualize\" onclick=\"pbVisualize(3,'N')\" ><\/td>\n<\/tr><\/table><\/div>\n<input type=\"hidden\" name=\"lang\" value=\"\"\/><input type=\"hidden\" id=\"inputInUse3\" name=\"inputInUse\" value=\"Y\"\/>\n<input type=\"hidden\" name=\"pyId\" value=\"3\"\/>\n<input type=\"hidden\" name=\"hash\" value=\"c5e7f878fdeebcbe32ffb76bc95b560c\"\/>\n<div id='pbresults3' class='pbresults'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>document.getElementById(\"submit3\").value = \"Run program\";document.getElementById(\"inputInUse3\").value = \"N\";<\/script>\n<\/p>\n<p>Funkcja <code>copy.copy()<\/code> dzia\u0142a r\u00f3wnie\u017c na inne rodzaje obiekt\u00f3w, ale nie b\u0119dzie to tutaj om\u00f3wione.<\/p>\n<h2>Metoda 3, u\u017cycie\u00a0<code>list()<\/code><\/h2>\n<p>Ostatnim sposobem na tworzenie prawdziwej kopii jest u\u017cycie funkcji list(). Zwykle <code>list()<\/code> s\u0142u\u017cy do konwertowania danych z innych typ\u00f3w na typ <code>listy<\/code>. (Na przyk\u0142ad, <code>list(\"hello\")<\/code> <a href=\"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/console\/?consolecode=L%20%3D%20list%28%27hello%27%29%0Aprint%28type%28L%29%29%0Aprint%28L%29%0Aprint%28L%5B0%5D%29%0Aprint%28type%28L%5B0%5D%29%29\" target=\"_blank\">konwertuje<\/a>  konwertuje \u0142a\u0144cuch \"hello\" na list\u0119 5 element\u00f3w, gdzie ka\u017cdy element ma jeden znak.) Je\u015bli jednak spr\u00f3bujesz przekonwertowa\u0107 co\u015b, co ju\u017c jest list\u0105 na list\u0119, wtedy otrzymasz kopi\u0119.<\/p>\n<p><form class=\"pbform\" action=\"#\" id=\"pbform4\" method=\"POST\">\n<div class='pybox modeNeutral  facultative' id='pybox4'>\n<div class=\"heading\"><span class=\"title\">Example<\/span><\/div>Kopiowanie z u\u017cyciem\u00a0<code>list()<\/code><div class='pyboxTextwrap pyboxCodewrap RO '  style='height: 110px;'><textarea wrap='off' name='usercode4' id='usercode4'  cols=10 rows=4 readonly='readonly'  style = 'height : 110px;'  class='pyboxCode RO'>\noldList = [\"first\", \"second\", \"third\"]\nnewList = list(oldList)     # tworzy kopi\u0119\noldList.reverse()\nprint(newList, oldList)<\/textarea><\/div>\n<div id='pbhistory4' class='flexcontain' style='display:none;'><\/div>\n<div class='pyboxbuttons'><table><tr>\n<td><input type='submit' name='submit' id='submit4' value=' '\/><\/td>\n<td><input type='button' name='consolecopy' value=\"Open in console\" onclick=\"pbConsoleCopy(4)\" ><\/td>\n<td><input type='button' name='visualize' value=\"Visualize\" onclick=\"pbVisualize(4,'N')\" ><\/td>\n<\/tr><\/table><\/div>\n<input type=\"hidden\" name=\"lang\" value=\"\"\/><input type=\"hidden\" id=\"inputInUse4\" name=\"inputInUse\" value=\"Y\"\/>\n<input type=\"hidden\" name=\"pyId\" value=\"4\"\/>\n<input type=\"hidden\" name=\"hash\" value=\"68263d8d1d77cc236cd0f590df10a975\"\/>\n<div id='pbresults4' class='pbresults'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>document.getElementById(\"submit4\").value = \"Run program\";document.getElementById(\"inputInUse4\").value = \"N\";<\/script>\n<\/p>\n<h2>Listy jako Argumenty<\/h2>\n<p>Zauwa\u017c, \u017ce ze wzgl\u0119du na spos\u00f3b pracy list, ka\u017cda funkcja akceptuj\u0105ca list\u0119 jako argument mo\u017ce zmieni\u0107 zawarto\u015b\u0107 tej listy. (Widzia\u0142e\u015b to ju\u017c w \u0107wiczeniu <code><a href=\"14-pl\/\">replace<\/a><\/code>.)<\/p>\n<p><div class='pybox modeNeutral' id='pybox5'>\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'>Short Answer Exercise: <\/span><span class='title'>Lista Argument\u00f3w<\/span><\/div>Jak\u0105 liczb\u0119 otrzymamy na wyj\u015bciu poni\u017cszego programu? <\/p>\n<pre>def func(list):<br\/> \u00a0\u00a0 list[0] = list[0] + list[1]<br\/> \u00a0\u00a0 list[1] = list[1] + list[0]<br\/>data = [3, 4]<br\/>func(data)<br\/>print(data[0]*data[1])<\/pre><label for=\"pyShortAnswer5\">Your answer (enter a number): <\/label><input type=\"text\" onkeypress=\"{if (event.keyCode==13) pbShortCheck(5)}\" id=\"pyShortAnswer5\"><div class=\"pyboxbuttons\"><input type=\"hidden\" name=\"type\" value=\"number\"\/><input type=\"hidden\" name=\"correct\" value=\"77\"\/><input type=\"hidden\" name=\"slug\" value=\"17.reference\"\/><input type=\"hidden\" name=\"lang\" value=\"\"\/><input type='submit' style='margin:5px;' value='Check answer' onClick = 'pbShortCheck(5)'\/><\/div><div class=\"pbresults\" id=\"pyShortResults5\"><\/div><div class=\"epilogue\">Prawid\u0142owo! Wewn\u0105trz<code>func<\/code>, zmieniamy element o indeksie 0 na 7 i element o indeksie 1 na 7+4=11. Wi\u0119c, wydrukuje  7*11.<\/div><\/div>\n<h2>Por\u00f3wnanie list za pomoc\u0105  <code>is<\/code><\/h2>\n<p>Kiedy dwie listy zmiennych <code>L1<\/code> i <code>L2<\/code> s\u0105 r\u00f3wne? Istniej\u0105 dwa r\u00f3\u017cne sposoby interpretacji tego pytania:<\/p>\n<ul>\n<li><em>Tym Samym(to\u017csame)<\/em>: Czy <code>L1<\/code> i <code>L2<\/code> wskazuj\u0105\/odnosz\u0105 si\u0119 dok\u0142adnie do tego samego obiektu listy?<\/li>\n<li><em>Te Same Warto\u015bci<\/em>:\u00a0Czy zawarto\u015b\u0107 listy <code>L1<\/code> jest r\u00f3wna zawarto\u015bci listy <code>L2<\/code>?<\/li>\n<\/ul>\n<p>Okazuje si\u0119, \u017ce w Pythonie standardowy operator r\u00f3wno\u015bci <code>==<\/code> ma <em>Te Same Warto\u015bci<\/em> oznacza to, co pokazuje poni\u017cszy przyk\u0142ad.<br \/>\n<form class=\"pbform\" action=\"#\" id=\"pbform6\" method=\"POST\">\n<div class='pybox modeNeutral  facultative' id='pybox6'>\n<div class=\"heading\"><span class=\"title\">Example<\/span><\/div>Znaczenie <code>==<\/code><div class='pyboxTextwrap pyboxCodewrap RO '  style='height: 84px;'><textarea wrap='off' name='usercode6' id='usercode6'  cols=10 rows=3 readonly='readonly'  style = 'height : 84px;'  class='pyboxCode RO'>\nL1 = ['text', 11]\nL2 = L1[:]        # robi kopi\u0119\nprint(L1 == L2)   # Te same warto\u015bci?<\/textarea><\/div>\n<div id='pbhistory6' class='flexcontain' style='display:none;'><\/div>\n<div class='pyboxbuttons'><table><tr>\n<td><input type='submit' name='submit' id='submit6' value=' '\/><\/td>\n<td><input type='button' name='consolecopy' value=\"Open in console\" onclick=\"pbConsoleCopy(6)\" ><\/td>\n<td><input type='button' name='visualize' value=\"Visualize\" onclick=\"pbVisualize(6,'N')\" ><\/td>\n<\/tr><\/table><\/div>\n<input type=\"hidden\" name=\"lang\" value=\"\"\/><input type=\"hidden\" id=\"inputInUse6\" name=\"inputInUse\" value=\"Y\"\/>\n<input type=\"hidden\" name=\"pyId\" value=\"6\"\/>\n<input type=\"hidden\" name=\"hash\" value=\"ba4a5474b6466e481aab60b84f226b8d\"\/>\n<div id='pbresults6' class='pbresults'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>document.getElementById(\"submit6\").value = \"Run program\";document.getElementById(\"inputInUse6\").value = \"N\";<\/script>\n<\/p>\n<p>Do sprawdzenia, czy s\u0105 <em>Tym Samym<\/em>, Python u\u017cywa  operatora <code>is<\/code>. U\u017cywamy tego operatora w taki sam spos\u00f3b jak <code>==<\/code>; sk\u0142adnia<\/p>\n<p style=\"text-align: center;\"><code>\u00ablist1\u00bb is\u00a0\u00ablist2\u00bb<\/code><\/p>\n<p>zwraca <code>True<\/code> je\u015bli listy odnosz\u0105 si\u0119 do tej samej listy, a <code>False<\/code>\u00a0je\u015bli odnosz\u0105 si\u0119 do r\u00f3\u017cnych list (nawet je\u015bli maj\u0105 te same tre\u015bci).<\/p>\n<p><form class=\"pbform\" action=\"#\" id=\"pbform7\" method=\"POST\">\n<div class='pybox modeNeutral  facultative' id='pybox7'>\n<div class=\"heading\"><span class=\"title\">Example<\/span><\/div>Znaczenie\u00a0<code>is<\/code><div class='pyboxTextwrap pyboxCodewrap RO '  style='height: 162px;'><textarea wrap='off' name='usercode7' id='usercode7'  cols=10 rows=6 readonly='readonly'  style = 'height : 162px;'  class='pyboxCode RO'>\nL = ['text', 11]\nLAgain = L             # another reference to L\nprint(LAgain is L)     # Same Identity? Yes\nLCopy = L[:]           # make a copy\nprint(LCopy == LAgain) # Same Values?   Yes, both are ['text', 11]\nprint(LCopy is LAgain) # Same Identity? No: LAgain is L, but LCopy is not L<\/textarea><\/div>\n<div id='pbhistory7' class='flexcontain' style='display:none;'><\/div>\n<div class='pyboxbuttons'><table><tr>\n<td><input type='submit' name='submit' id='submit7' value=' '\/><\/td>\n<td><input type='button' name='consolecopy' value=\"Open in console\" onclick=\"pbConsoleCopy(7)\" ><\/td>\n<td><input type='button' name='visualize' value=\"Visualize\" onclick=\"pbVisualize(7,'N')\" ><\/td>\n<\/tr><\/table><\/div>\n<input type=\"hidden\" name=\"lang\" value=\"\"\/><input type=\"hidden\" id=\"inputInUse7\" name=\"inputInUse\" value=\"Y\"\/>\n<input type=\"hidden\" name=\"pyId\" value=\"7\"\/>\n<input type=\"hidden\" name=\"hash\" value=\"9b852f7b5486e559e1a1d08b0086a52b\"\/>\n<div id='pbresults7' class='pbresults'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>document.getElementById(\"submit7\").value = \"Run program\";document.getElementById(\"inputInUse7\").value = \"N\";<\/script>\n<\/p>\n<p><div class='pybox modeNeutral' id='pybox8'>\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'>Short Answer Exercise: <\/span><span class='title'>Liczenie True<\/span><\/div>Ile razy zostanie wy\u015bwietlone\u00a0<code>True<\/code>\u00a0na wyj\u015bciu tego programu? (Narysuj diagram, aby \u0142atwiej prze\u015bledzi\u0107.) <\/p>\n<pre>list1 = [9, 1, 1]<br\/>list3 = list(list1)<br\/>list2 = list1<br\/>list4 = list3[:]<br\/>list1[0] = 4<br\/>list5 = list1<br\/>print(list1 is list2, list2 is list3, list3 is list4, list4 is list5)<br\/>print(list1 == list2, list2 == list3, list3 == list4, list4 == list5)<\/pre><label for=\"pyShortAnswer8\">Your answer (enter a number): <\/label><input type=\"text\" onkeypress=\"{if (event.keyCode==13) pbShortCheck(8)}\" id=\"pyShortAnswer8\"><div class=\"pyboxbuttons\"><input type=\"hidden\" name=\"type\" value=\"number\"\/><input type=\"hidden\" name=\"correct\" value=\"3\"\/><input type=\"hidden\" name=\"slug\" value=\"17.is\"\/><input type=\"hidden\" name=\"lang\" value=\"\"\/><input type='submit' style='margin:5px;' value='Check answer' onClick = 'pbShortCheck(8)'\/><\/div><div class=\"pbresults\" id=\"pyShortResults8\"><\/div><div class=\"epilogue\">Prawid\u0142owo! Na wyj\u015bciu otrzymamy\n<code>\nTrue False False False<\/code>\n\nTrue False True False<\/div><\/div>\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> Nie nale\u017cy u\u017cywa\u0107\u00a0<code>is<\/code>\u00a0razem z  \u0142a\u0144cuchami lub  liczbami, poniewa\u017c == poprawnie testuje r\u00f3wno\u015b\u0107, a zachowanie\u00a0<code>is<\/code>\u00a0jest <a href=\"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/console\/?consolecode=%23%20dlaczego%20%22is%22%20jest%20podst%C4%99pne%20dla%20%C5%82a%C5%84cuch%C3%B3w%3F%0Aprint%28%22foo%22%20is%20%22foo%22%2C%20%22foo%22%20is%20%22fo%22%2B%22o%22%29%20%23%20oba%20True%2C%20w%C5%82a%C5%9Bciwy%20%C5%82a%C5%84cuch%C3%B3w%20internalizowanych%20%28internowanych%29%0Aprint%28%22e%22%2A32%20is%20%22ee%22%2A16%29%20%23%20False%2C%20d%C5%82ugie%20%C5%82a%C5%84cuchy%20nie%20s%C4%85%20internalizowane%0AA%20%3D%20%22foo%22%0AB%20%3D%20%22foofoo%22%0AA%20%2A%3D%202%0Aprint%28A%20%3D%3D%20B%2C%20A%20is%20B%29%20%23%20True%20False%3A%20%2A%3D%20nie%20re-internuje%20%C5%82a%C5%84cucha%0A%0A%23%20dlaczego%20%20%22is%22%20%20jest%20podst%C4%99pne%20dla%20liczb%0Aprint%281%2B1%20is%202%29%20%23%20True%2C%20ale%20to%20zachowanie%20wystepuje%20tylko%20dla%20ma%C5%82ych%20liczb%20Integer%0Aprint%2810%2A%2A3%20is%201000%29%20%23%20False%0Aprint%281.5%20is%201.5%2C%201.5%20is%200.5%2A3%29%20%23%20True%2C%20False%0Aprint%28float%28%27NaN%27%29%3D%3Dfloat%28%27NaN%27%29%2C%20float%28%27NaN%27%29%20is%20float%28%27NaN%27%29%29%20%23%20oba%20False%0Ax%20%3D%20float%28%27NaN%27%29%0Aprint%28x%20is%20x%2C%20x%20%3D%3D%20x%29%20%23%20True%20False%3B%20jeden%20z%20kilku%20przyk%C5%82ad%C3%B3w%20z%20%27is%27T%2C%20%3D%3DF%0Aprint%280.0%20is%200%2C%200.0%20%3D%3D%200%29%20%23%20False%20True%0A%0A%23ponadto%2C%20%22is%22%20nie%20jest%20tym%20samym%20co%20por%C3%B3wnanie%20id%28%29%20http%3A%2F%2Fcodepad.org%2FXb0TaKl9%0A%0A\" target=\"_blank\"> trudne do przewidzenia<\/a> na \u0142a\u0144cuchach i liczbach. <\/span><\/td><\/table><\/p>\n<h2>Listy zagnie\u017cd\u017cone<\/h2>\n<p>Mamy ju\u017c wi\u0119kszo\u015b\u0107 wa\u017cnych informacji, ale warto wspomnie\u0107 o jednej innej wsp\u00f3lnej sytuacji. Jak wspomniano w poprzedniej lekcji, <em>zagnie\u017cd\u017cona<\/em> lista to lista wewn\u0105trz innej listy, na przyk\u0142ad<\/p>\n<p style=\"text-align: center;\"><code>sample = [365.25, [\"first\", 5]]<\/code><\/p>\n<p><em>Zewn\u0119trzna<\/em> lista, kt\u00f3ra odnosi si\u0119 do <code>sample<\/code>, ma dwa elementy; Element o indeksie 0 to liczba float (liczba zmiennoprzecinkowa \u2013 reprezentacja liczby rzeczywistej zapisanej za pomoc\u0105 notacji naukowej), a element na indeksie 1 jest list\u0105 <em>wewn\u0119trzn\u0105<\/em>. Wewn\u0119trzna lista to <code>[\"first\", 5]<\/code>. (Mo\u017cesz te\u017c mie\u0107 wi\u0119cej poziom\u00f3w zagnie\u017cd\u017cania.) Kiedy rozpoczynasz korzysta\u0107 z zagnie\u017cd\u017conych list nale\u017cy pami\u0119ta\u0107 o:<\/p>\n<ul>\n<li>Zastosowanie trzech powy\u017cszych metod do <code>sample<\/code> spowoduje skopiowanie listy zewn\u0119trznej, ale nie listy wewn\u0119trznej. Zatem <code>copy(sample)[1] is sample[1]<\/code> oznacza to, \u017ce kopia nadal jest odniesieniem do cz\u0119\u015bci oryginalnej listy. Prawdopodobnie, to nie by\u0142o to, czego chcia\u0142e\u015b. Je\u015bli chcesz wykona\u0107 prawdziw\u0105 kopi\u0119 na wszystkich poziomach, u\u017cyj <code>copy.deepcopy()<\/code>.<\/li>\n<li>Sprawdzanie zagnie\u017cd\u017conych list z u\u017cyciem <code>==<\/code> jest bardzo intuicyjne: Python rekurencyjnie wywo\u0142uje <code>==<\/code> na ka\u017cdym elemencie listy. Na przyk\u0142ad <code>[[1, 2], 3]==[[1, 2], 3]<\/code> jest <code>True<\/code>, a <code>[[1, 2], 3]==[1, 2, 3]<\/code> jest <code>False<\/code>, poniewa\u017c pierwsze elementy S\u0105 r\u00f3\u017cne (<code>[1, 2] != 1<\/code>).<\/li>\n<\/ul>\n<p><form class=\"pbform\" action=\"#\" id=\"pbform9\" method=\"POST\">\n<div class='pybox modeNeutral  facultative' id='pybox9'>\n<div class=\"heading\"><span class=\"title\">Example<\/span><\/div><code>deepcopy<\/code> i r\u00f3wno\u015b\u0107 rekurencyjna<div class='pyboxTextwrap pyboxCodewrap RO '  style='height: 266px;'><textarea wrap='off' name='usercode9' id='usercode9'  cols=10 rows=10 readonly='readonly'  style = 'height : 266px;'  class='pyboxCode RO'>\nimport copy\nsample = [365.25, [\"first\", 5]]\nclone = copy.copy(sample)\nprint(sample, clone)\nprint(sample == clone, sample is clone)\nprint(sample[1] == clone[1], sample[1] is clone[1])\ndeepclone = copy.deepcopy(sample)\nprint(deepclone)\nprint(sample == deepclone, sample is deepclone)\nprint(sample[1] == deepclone[1], sample[1] is deepclone[1])<\/textarea><\/div>\n<div id='pbhistory9' class='flexcontain' style='display:none;'><\/div>\n<div class='pyboxbuttons'><table><tr>\n<td><input type='submit' name='submit' id='submit9' value=' '\/><\/td>\n<td><input type='button' name='consolecopy' value=\"Open in console\" onclick=\"pbConsoleCopy(9)\" ><\/td>\n<td><input type='button' name='visualize' value=\"Visualize\" onclick=\"pbVisualize(9,'N')\" ><\/td>\n<\/tr><\/table><\/div>\n<input type=\"hidden\" name=\"lang\" value=\"\"\/><input type=\"hidden\" id=\"inputInUse9\" name=\"inputInUse\" value=\"Y\"\/>\n<input type=\"hidden\" name=\"pyId\" value=\"9\"\/>\n<input type=\"hidden\" name=\"hash\" value=\"9e283f578fffcb8094b88d7e64992baa\"\/>\n<div id='pbresults9' class='pbresults'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>document.getElementById(\"submit9\").value = \"Run program\";document.getElementById(\"inputInUse9\").value = \"N\";<\/script>\n<\/p>\n<p>Zako\u0144czy\u0142e\u015b t\u0119 lekcj\u0119! Kolejny dodatkowy materia\u0142 jest opcjonalny.<\/p>\n<hr \/>\n<h2>Tuples: <code>(\"immutable\", \"lists\")<\/code><\/h2>\n<p>Wspomnieli\u015bmy powy\u017cej, \u017ce gdy wywo\u0142asz funkcj\u0119 na li\u015bcie, mo\u017ce to zmieni\u0107 list\u0119. Czasami chcesz to uczyni\u0107 niemo\u017cliwym! Rozwi\u0105zanie w Pythonie polega na tworzeniu <em>tuple<\/em> (krotek), kt\u00f3re s\u0105 takie same jak listy, z wyj\u0105tkiem tego, \u017ce nigdy nie mo\u017cna ich zmieni\u0107. M\u00f3wimy, \u017ce listy s\u0105 \"<em>zmienne<\/em>\", a krotki s\u0105 \"<em>niezmienne<\/em>\". (Ci\u0105gi i liczby s\u0105 niezmienne). Mo\u017ce to by\u0107 u\u017cyteczny spos\u00f3b, aby zapobiec b\u0142\u0119dom programowania wynikajacym ze zmieny list, kt\u00f3re powinny pozosta\u0107 niezmienione. Tuple s\u0105 prawie identyczne z listami, z tym wyj\u0105tkiem, \u017ce zamiast nawias\u00f3w kwadratowych <code>[]<\/code> u\u017cywaj\u0105 okr\u0105g\u0142ych nawias\u00f3w <code>()<\/code>. Mo\u017cna dokonywa\u0107 konwersji mi\u0119dzy krotkami i listami za pomoc\u0105 <code>tuple()<\/code> i <code>list()<\/code>.<\/p>\n<p><form class=\"pbform\" action=\"#\" id=\"pbform10\" method=\"POST\">\n<div class='pybox modeNeutral  facultative' id='pybox10'>\n<div class=\"heading\"><span class=\"title\">Example<\/span><\/div>Tubular tuples<div class='pyboxTextwrap pyboxCodewrap RO '  style='height: 188px;'><textarea wrap='off' name='usercode10' id='usercode10'  cols=10 rows=7 readonly='readonly'  style = 'height : 188px;'  class='pyboxCode RO'>\nT = (3, 4, 5)\nprint(T)\nprint(type(T))           # tuple (krotki)\nprint(T[0])              # pierwszy element tupli\nprint(list(T))           # convwersja tupli na list\u0119\nprint(tuple([1, 2, 3]))  # conwersja listy na tupl\u0119\nT[0] = \"three\"           # Error! Nie mo\u017cesz zmieni\u0107 warto\u015bci tupli<\/textarea><\/div>\n<div id='pbhistory10' class='flexcontain' style='display:none;'><\/div>\n<div class='pyboxbuttons'><table><tr>\n<td><input type='submit' name='submit' id='submit10' value=' '\/><\/td>\n<td><input type='button' name='consolecopy' value=\"Open in console\" onclick=\"pbConsoleCopy(10)\" ><\/td>\n<td><input type='button' name='visualize' value=\"Visualize\" onclick=\"pbVisualize(10,'N')\" ><\/td>\n<\/tr><\/table><\/div>\n<input type=\"hidden\" name=\"lang\" value=\"\"\/><input type=\"hidden\" id=\"inputInUse10\" name=\"inputInUse\" value=\"Y\"\/>\n<input type=\"hidden\" name=\"pyId\" value=\"10\"\/>\n<input type=\"hidden\" name=\"hash\" value=\"8421e40fd59f394b612eb6d7eb3f086b\"\/>\n<div id='pbresults10' class='pbresults'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>document.getElementById(\"submit10\").value = \"Run program\";document.getElementById(\"inputInUse10\").value = \"N\";<\/script>\n<\/p>\n<h2>Do <code>\u221e<\/code> i Dalej: Samozatrzymanie<\/h2>\n<p>Mo\u017cna mie\u0107 list\u0119, kt\u00f3ra zawiera sam\u0105 siebie! Wystarczy utworzy\u0107 list\u0119, a nast\u0119pnie tak przekierowa\u0107 jeden z jej element\u00f3w, aby wskazywa\u0142 ca\u0142\u0105 list\u0119:<\/p>\n<p><form class=\"pbform\" action=\"#\" id=\"pbform11\" method=\"POST\">\n<div class='pybox modeNeutral  facultative' id='pybox11'>\n<div class=\"heading\"><span class=\"title\">Example<\/span><\/div>A circular reference<div class='pyboxTextwrap pyboxCodewrap RO '  style='height: 136px;'><textarea wrap='off' name='usercode11' id='usercode11'  cols=10 rows=5 readonly='readonly'  style = 'height : 136px;'  class='pyboxCode RO'>\nL = [\"zero\", \"one\"]\nL[1] = L\nprint(len(L))\nprint(L)\nprint(L is L[1])<\/textarea><\/div>\n<div id='pbhistory11' class='flexcontain' style='display:none;'><\/div>\n<div class='pyboxbuttons'><table><tr>\n<td><input type='submit' name='submit' id='submit11' value=' '\/><\/td>\n<td><input type='button' name='consolecopy' value=\"Open in console\" onclick=\"pbConsoleCopy(11)\" ><\/td>\n<td><input type='button' name='visualize' value=\"Visualize\" onclick=\"pbVisualize(11,'N')\" ><\/td>\n<\/tr><\/table><\/div>\n<input type=\"hidden\" name=\"lang\" value=\"\"\/><input type=\"hidden\" id=\"inputInUse11\" name=\"inputInUse\" value=\"Y\"\/>\n<input type=\"hidden\" name=\"pyId\" value=\"11\"\/>\n<input type=\"hidden\" name=\"hash\" value=\"ef2417b9b7c2f2b395ad4f54e60f4005\"\/>\n<div id='pbresults11' class='pbresults'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>document.getElementById(\"submit11\").value = \"Run program\";document.getElementById(\"inputInUse11\").value = \"N\";<\/script>\n<\/p>\n<p>Zauwa\u017c, \u017ce Pythona jest na tyle inteligentny, \u017ce mo\u017ce rozpozna\u0107, \u017ce lista powraca do siebie: drukuje \"<code>...<\/code>\", zamiast drukowa\u0107 wszystkie <code>L<\/code>, aby unikn\u0105\u0107 niesko\u0144czonej p\u0119tli.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>W tej lekcji podajemy szczeg\u00f3\u0142y dotycz\u0105ce sposobu przechowywania list w Pythonie. Kopiowanie i por\u00f3wnywanie list mo\u017ce mie\u0107 nieoczekiwane konsekwencje. Wyja\u015bnimy, jak Python dzia\u0142a wewn\u0119trznie, aby\u015b m\u00f3g\u0142 zrozumie\u0107 i unika\u0107 tych b\u0142\u0119d\u00f3w. Og\u00f3lnie rzecz bior\u0105c, kilka r\u00f3\u017cnych zmiennych mo\u017ce \"wskazywa\u0107\" lub &hellip; <a href=\"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/17-pl\/\">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-10004","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages\/10004","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=10004"}],"version-history":[{"count":24,"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages\/10004\/revisions"}],"predecessor-version":[{"id":10472,"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages\/10004\/revisions\/10472"}],"wp:attachment":[{"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/media?parent=10004"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}