Viktigt angående hemtal och att rita vad som händer i minnet! Global

Övning 3 tilpro05 10 november 2005
Viktigt angående hemtal och att rita vad som händer i minnet!
Listor och dictionaries är referenser, dvs de hanteras genom en sorts pekare. Därför är det
väldigt viktigt att påpeka/illustrera detta när ni redovisar labbar eller skriver lösningar till
uppgifter! I uppgift 1b i första hemtalet:
Vad har a och b för värden efter följande satser? Rita minnesbild!
a = range(4)
b = a
b[1] = 8
En del av svaret är att visa att a och b faktiskt delar data. Bra svar:
a
[0,8,2,3] a och b pekar på samma data, ändrar man a:s data, ändras b:s data.
b
Dessutom: testa er egen kod! Testa koden i uppgiften. Det hade varit lätt att se att range(4) skapar [0,1,2,3] och inte [1,2,3,4] bara genom att använda print.
Global-problematiken
För att slippa få de problem som globala variabler kan orsaka, kan man lägga sitt program i en
metod som man sedan anropar. Då förblir de lokala variablerna lokala:
def main():
#lägg din programkod här
if(__name__ == ”__main__”
main()
Bortsett från lab2, kan man allmänt säga att omotiverade globala variabler är dåliga och kan
leda till underkända labbar. I de flesta fall kan man lösa problemen utan globala variabler!
Pekare i allmänhet
Numeriska typer som int, float och true/false har ett enkelt beteende: vid tilldelning så
kopieras deras värde. Om de skickas som argument eller returneras från en metod, så kopieras
deras värde också. Strängar och komplexa tal beter sig som enkla typer men använder pekare. Strängarna
därför att de kan ha godtycklig längd, vilket gör att det är enklare att lagra dem på annan plats
och sedan hänvisa till den minneplatsen (adressen). Komplexa tal för att de realiseras med hjälp
av en tupel som också kan vara godtyckligt stora, men i det komplexa fallet bara har två element.
För båda dessa typer gäller att man kan inte förändra deras delar, utan man skapar helt enkelt
en ny som man pekar till. Exempel snodda från Per­Anders:
namn1 = ”Pa”
namn2 = namn1
namn1 = namn1+” Staav”
namn2[0] = ”S” #går ej!
namn1
namn2
”Pa” #minnesplats 1
”Pa Staav” #minnesplats 2
Alla andra typer i Python har ett rent pekar­beteende, dvs om man använder en pekare och
Övning 3 tilpro05 10 november 2005
förändrar delar av det data som den pekar till, så förändras datat för alla som pekar till det.
Detta gäller också egendefinierade typer, dvs klasser som vi själva skriver.
Klasser, även kallade egendefinierade typer
Ibland vill man klumpa ihop data i en enhet som man sedan behandlar på olika sätt. Detta
kallas för inkapsling. Man gör en mall (klassdefinitionen) där man definierar vilka data
(medlemsvariabler) som finns och vilka operationer (medlemsfunktioner) som man kan
använda. Utifrån denna mall skapar man sedan s.k. instanser (objekt) av sin klass. Instanserna
innehåller då en egen kopia av medlemsvariablerna, dvs medlemsvariablerna är individuella.
Instanserna kan då ha sinsemellan olika värden på medlemsvariablerna. Egendefinierade typer
har också pekarbeteende! Dvs om flera variabler pekar till samma instans, och en av
variablerna ändrar på instansens innehåll kommer förändringen även synas för den andra
variabeln, precis som när vi använder listor och dictionaries!
Värdet None
Värdet None används för att tilldela en variabel ett värde som representerar ”inget värde”. Den
är mycket användbar som markör, t ex i länkade listor. De flesta språk har en motsvarighet till
None. Då kan man ha en variabel, men utan att den har ett värde, och man kan dessutom kolla
om den har ett värde eller ej. Man kan också markera att något inte finns genom att returnera
None från en metod.
Länkade listor
En mycket användbar datastruktur som är grunden för mycket inom datalogin. Genom att förstå
konceptet länkade listor, ökar man även förståelsen för köer, stackar, träd, rekursion mm.
Stabila sorteringsalgoritmer
Stabila sorteringar behåller den inbördes ordningen mellan element med samma nyckel. T ex
om vi sorterar först på namn och sedan på ålder så kommer posterna med samma ålder att vara i
namnordning. Formellt: Om R, S har samma nyckel och R var före S i listan innan
sorteringen så kommer R att hamna före S efter sorteringen. Bubblesort och insertionsort
är stabila, medan selectionsort och quicksort inte är det.
Lab2
Under lab2 är det mycket användbart att läsa sig till vad vissa funktioner gör, t ex match och
search. På Pythons hemsida finns det s k dokumentation över språket och vissa moduler:
http://docs.python.org/lib/contents.html
Från python.org kan man även söka på saker som man inte förstår. Gör det!