Mutable/immutable i Python

I python har en klass två huvudattribut: huruvida den är

  • möjlig att förändra (mutable)
  • ifall den är unikt identifierbar (hashable)

Dessa koncept är relativt enkla att förstå sig på när man inte funderar aktivt på saken men försöker man precisera vad som gör ett objekt förändringsbart och vad som gör det unikt identifierbart tycker jag det är klurigt.

Till exempel är alla numeriska variabler immutable vilket innebär att man inte kan skicka t.ex en integer till en funktion göra ett antal operationer och sedan returnera och tro att den integer man använt är förändrad.

Ex:

def add_two(i):
  i + 2

a = 1
add_two(a)
print a

i exemplet ovan kommer a fortfarande vara 1 i print-satsen eftersom i funktionen add_two kommer en kopia användas då a är immutable. I C används pekare för att skilja på referenser och värden men ingen sådan mekanism verkar finnas i python. jag har själv lyckats skapa ett eget förändringsbart (mutable) heltal men jag är lite osäker på vad som håller den förändringsbar och ifall jag på något vis kan uppdatera den så att den plötsligt inte är förändringsbar (immutable). Någon python-guru där ute som har något råd?

mitt grundläggande förändringsbara heltal:

class mutable_int():
    a = 1
    def __init__(self):
        pass
    def __setattribute__(self, v):
        self.a = v
    def __add__(self, v):
        self.a += v
    def __getattribute(self):
        return self.a
    def __repr__(self):
        return str(self.a)

Men hur konstruerar jag en klass som inte är förändringsbar?

Jag återkommer vid tillfälle och frågar om den andra aspekten av variabler, hashningsbarhet.

Etiketter: , , ,

2 svar to “Mutable/immutable i Python”

  1. JohanA Says:

    Python är klurigt när man dyker djupare i det, men fortfarande jäkligt smart när man fattar varför det är som det är. Jag gick en kurs och greppade upplägget med ”variabler” i säker två hela dagar, sen försvann det…

  2. akeinexile Says:

    Jag kommer nog försöka läsa ”Thinking in Python” (http://www.mindview.net/Books/TIPython) i mellandagarna, kanske får jag mer insikt då…

Kommentera

Fyll i dina uppgifter nedan eller klicka på en ikon för att logga in:

WordPress.com Logo

Du kommenterar med ditt WordPress.com-konto. Logga ut / Ändra )

Twitter-bild

Du kommenterar med ditt Twitter-konto. Logga ut / Ändra )

Facebook-foto

Du kommenterar med ditt Facebook-konto. Logga ut / Ändra )

Google+ photo

Du kommenterar med ditt Google+-konto. Logga ut / Ändra )

Ansluter till %s


%d bloggare gillar detta: