Huom! Tämä artikkeli on kategoriassa 'ViLLE-spesifiset jutut' sen takia, että se käyttää ViLLEä esimerkkinä. Viittaustyyppiset muuttujat toimivat samalla tavalla myös ViLLEn ulkopuolella.

Olet tekemässä ViLLE-tehtävää, jossa pitäisi tehdä funktio, joka tyhjentää parametrina annetun listan.

ViLLEn testikoodissa luodaan lista, ja annetaan se parametriksi sinun funktiollesi:

villen_lista = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print("Lista ennen:", villen_lista)
tyhjenna(villen_lista)
print("Lista jälkeen:", villen_lista)

Lähdetään koodaamaan funktiota. Yrität toteuttaa funktion näin:

def tyhjenna(lista):
    lista = []

Mutta hups! ViLLE sanookin näin:

Lista ennen: [1, 2, 3, 4, 5, 6, 7, 8, 9]
Lista jälkeen: [1, 2, 3, 4, 5, 6, 7, 8, 9]

Miksei lista muuttunut??

tyhjenna-funktion sisäinen muuttuja lista on viittaustyyppinen muuttuja. Tämä tarkoittaa, että se ei sisällä listaa, vaan listan osoitteen muistissa:

Myös ViLLEn testikoodin villen_lista-muuttuja osoittaa samaan listaan muistissa (villen_listahan oli se alkuperäinen listamuuttuja, jonka viittaus annettiin funktiokutsun yhteydessä lista-muuttujalle):

Mutta mitä tapahtuu tyhjenna-funktiossa?

Rivillä lista = [] luodaan uusi tyhjä lista, jonka viittaus tallennetaan muuttujaan lista. lista on tyhjenna-funktion sisäinen muuttuja, joten siihen tehdyt muutokset eivät näy mitenkään funktion ulkopuolella. Tulos on tämä:

Alkuperäistä listaa ei siis ole tyhjennetty. Mutta miten se sitten tyhjennetään?

Sinun täytyy välttää minkään koodirivin kirjoittamista, jossa on alussa "lista =", sillä tällaisilla riveillä tallennetaan lista-muuttujaan jotain muuta kuin sen alkuperäinen arvo (viittaus alkuperäiseen listaan). Sitten sinulla ei ole enää mitään viittausta alkuperäiseen listaan, jonka kautta voisit sitä muokata.

Pythonissa on monia funktioita, jotka muokkaavat alkuperäistä listaa uuden luomisen sijaan. Tässä joitain esimerkkejä niistä:

Näistä tähän tehtävään toimivin on funktio clear, joka poistaa listasta kaikki alkiot luomatta uutta listaa:

Korjattu koodi näyttää tältä:

def tyhjenna(lista):
    lista.clear()