Ennen kuin tarkastellaan näitä Pythonin kehittyneempiä muuttujia, on syytä tutkia muuttujien muutettavuutta. Kaikki muuttujat Pythonissa ovat joko muutetavia tai muuttamattomia. Kaikki tähän mennessä tarkastellut muuttujat ovat muuttamattomia.
Muuttamattomat muuttujia ei nimensä mukaisesti voi muuttaa. Kaikki niille tehtävät operaatiot eivät muuta niitä, vaan operaatio (esim. kokonaislukujen yhteenlasku) luo uuden muuttujan, pyyhkii vanhan ja asettaa uuden arvon vanhan paikalle. Alkuperäinen arvo ei siis muutu vaan se korvataan.
Muutettava muuttuja sen sijaan voi muuttua. Käytännön seuraus tästä on, että kun kahteen muuttujaan on laitettu sama muutettava arvo, toisen muuttaminen muuttaa molempia. Useimmilla kokoelmilla on sekä muutettava että muuttumaton versio. Muutettavilla muuttuja tyypeillä on vain useampia metodeja arvojen muuttamista varten.
Esimerkiksi lista on monikon muutettava versio. Listalla on samat metodit kuin monikolla. Lista ilmaistaan samalla tavalla kuin monikko, mutta sulkumerkkien sijaan käytetään hakasulkeita.
{code}
[12, 56, 9, 0, 45, 3, 8, 10]
>>> [3, 17, 0] * 2
[3, 17, 0, 3, 17, 0]
>>> [2, "abcd", True, 7, 90][2]
True
>>> [2, "abcd", True, 7, 90][1:4]
['abcd', True, 7]
>>>
{code}
Lisäksi listaa pystyy muuttamaan sijoittamalla uuden arvon alkion tilalle tai uuden listan leikkauksen paikalle. Metodilla append voi lisätä alkion listan loppuun ja metodilla insert haluttuun kohtaan listaa. Tässä näkyy kuinka listan L1 muuttaminen on muuttanut listaa L2.
{code}
>>> L1 = [3, 6, 77]
>>> L2 = L1
>>> L2
[3, 6, 77]
>>> L1[1] = "abcd"
>>> L1
[3, 'abcd', 77]
>>> L1.append(12)
>>> L1
[3, 'abcd', 77, 12]
>>> L1[1:3] = ["www", False, -14]
>>> L1
[3, 'www', False, -14, 12]
>>> L1.insert(3, 100)
>>> L1
[3, 'www', False, 100, -14, 12]
>>> L2
[3, 'www', False, 100, -14, 12]
>>>
{code}
Listan voi myös sijoittaa itsensä alkioksi, jolloin kyseinen alkio on sama kuin koko lista.
{code}
>>> L1[2] = L1
>>> L1
[3, 'www', [...], 100, -14, 12]
>>> L1[2]
[3, 'www', [...], 100, -14, 12]
>>> L1[2][3]
100
>>>
{code}
Funktiolla list voi muuntaa kokoelman listaksi. Lisäksi sen avulla onnistuu kopion tekeminen olemassa olevasta listasta niin, ettei yhden muuttaminen muuta molempia.
{code}
>>> L1 = [23, 1]
>>> L2 = list(L1)
>>> L2
[23, 1]
>>> L1.append(True)
>>> L1
[23, 1, True]
>>> L2
[23, 1]
>>>
{code}
Joukko on Pythonissa, niinkuin matematiikan joukko-opissa, kokoelma, jossa sama alkio voi esiintyä vain kerran. Joukoille on samoja operaatioita kuin joukko-opissa; unioni \|, leikkaus & ja erotus \-. Alkioita joukkoon voi lisätä metodilla add ja poistaa metodilla remove, jotka ottavat parametriksi lisättävän/poistettavan alkion arvon. Joukot ilmaistaan samaan tapaan kuin monikot ja listat, mutta niissä käytetään aalltosulkuja. Indeksointi operaattori ei toimi joukoille, koska alkiot eivät ole järjestetty tiettyyn järjestykseen niinkuin listassa.
{code}
>>> S1 = {1, "xy", False, 77}
>>> S2 = {22, "abc", 1, 1, False}
>>> S1
{False, 1, 'xy', 77}
>>> S2
{False, 1, 'abc', 22}
>>> S1 | S2
{False, 1, 'abc', 77, 'xy', 22}
>>> S1 & S2
{False, 1}
>>> S1 - S2
{'xy', 77}
>>> S2 - S1
{'abc', 22}
>>>
{code}
Tavalliset (siis aaltosulkujen avulla ilmaistavat) joukot ovat muutettavia, mutta funktion frozenset avulla voi tehdä kokoelmista muuttamattomia joukkoja. Vastaavasti funktiolla set saa kokoelmasta tavallisen joukon.
Aaltosulkeita käytetään myös hakurakenteen ilmaisemisessa niinkuin joukossakin. Hakurakenteessa alkioiden sijaan luetellaan avain/arvo pareja kaksoispisteellä erotettuna. Avain tulee kaksoispisteen vasemmalle puolelle; sen pitää olla muuttamaton eikä sama arvo saa esiintyä avaimena kahta kertaa.
Hakurakenne toimii niin, että indeksoitaessa sille annetaan jonkun avaimen arvo ja se palauttaa avaimeen säilötyn arvon. Sijoitettaessa arvon avaimeen indeksoinnilla vanha arvo korvataan uudella. Jos avainta ei ole valmiiksi olemassa, lisätään hakurakenteeseen uusi avain.
{code}
>>> D = {"ab" : 12, 100 : "Q", (1, 4) : 22}
>>> D["ab"]
12
>>> D[1, 4]
22
>>> D["ab"] = 999
>>> D
{'ab': 999, 100: 'Q', (1, 4): 22}
>>> D[30] = -12
>>> D
{'ab': 999, 100: 'Q', 30: -12, (1, 4): 22}
>>>
{code}
Avainsanan in avulla voi testata onko hakurakenteessa tiettyä avainta - ei siis arvoa. Samoin for toistorakenteessa käydään läpi avaimet eikä arvoja. metodi keys palauttaa listan, joka sisältää hakurakenteessa olevat avaimet.
Indeksointi arvolla, joka ei vastaa mitään hakurakenteessa olevaa avainta, aiheuttaa virheen. Sen sijaan metodi get, jolla myös voi noutaa avaimen osoittamia arvoja, palauttaa arvon None vastaavassa tapauksessa. |