Frågor & Svar
På denna sida har vi samlat svar på frågor som dykt upp under kursens gång. Om du har en fråga som du inte hittar svaret på här, tveka inte att kontakta examinator.
Pythonuppgifter
Pythonuppgift 12.8: Rättningsskriptet ger mig fel men det blir rätt när jag kör koden själv. Varför?
Troligtvis beror det på att du använder en variabel som delas mellan separata funktionsanrop och därmed “kommer ihåg” värdet från föregående anrop. T.ex. att man har en variabel seen
eller liknande som ligger utanför funktionen. Ett exempel på detta är om du har en lista eller mängd som du lägger till saker i för att hålla koll på vilka element som redan ingår i resultatet. Om du då inte återställer den listan eller mängden i början av funktionen kommer den att innehålla saker från föregående anrop, vilket kan leda till felaktiga resultat. Samtidigt vill man ju att denna ska vara samma mellan rekursiva anrop, så det är inte helt trivialt att lösa.
Testa att köra nedanstående. Ja, det ska vara två identiska rader.
print(f"DEBUG: {remove_duplicates([1, 2, 3, 2, 1, 4, 5, 3, 6])=}")
print(f"DEBUG: {remove_duplicates([1, 2, 3, 2, 1, 4, 5, 3, 6])=}")
Får du samma resultat båda gångerna? Om inte, så är det troligt att du har en sådan delad variabel. Lösningen är att se till att alla variabler som används för att hålla koll på mellanresultat nollas i början av funktionen. Detta kan vara klurigt men täcks i sista avsnittet i förberedelsematerialet till Storseminarium 2.1.
Det lämpligaste i den här situationen är nog det andra alternativet, att sätta den här variabeln till en ny lista eller mängd i remove_duplicates
och sedan ha en nästlad rekursiv funktion som utför själva arbetet.
Alternativt kan man ha den här variabeln som en default-parameter till remove_duplicates
men då måste man vara försiktig. Kom ihåg att själva def
-raden för en funktionsdefinition bara evalueras en gång, när funktionen definieras. Det betyder att eventuella default-parametrar bara tilldelas en gång. Om en default-parameter är av en muterbar datatyp, t.ex. list
, set
eller dict
, så kommer alla anrop till remove_duplicates
alltså ändå att använda samma objekt. När man vill ha ett muterbart default-värde i Python som ska “återställas” vid varje icke-rekursivt anrop så måste man på något sätt hantera detta. Det vanligaste är att t.ex. göra följande:
def my_func(vanlig_parameter, parameter_med_muterbart_defaultvärde=None):
if parameter_med_muterbart_defaultvärde is None:
parameter_med_muterbart_defaultvärde = list() # eller set(), eller
# dict(), eller vad det nu är för muterbar datatyp
...
# resten av funktionen
Sedan skickar man så klart med den här parametern (som nu inte längre är None
och därför inte ska återställas) vid eventuella rekursiva anrop.
Sidansvarig: Johan Falkenjack
Senast uppdaterad: 2025-10-16