Fogadd el a megváltoztathatatlant!

Ez a poszt a Python változótípusainak egy érdekes tulajdonságával ismertet meg bennünket. Kezdve azon, hogy a Python változói nem is változók. Áááááááááááááááááá! Anyúúúúú, bántanak!!!

Szóval a Python valójában objektumhivatkozásokkal dolgozik. Az objektumhivatkozás (angolul: object reference) egy olyan hivatkozás (reference), ami egy objektumra mutat a számítógép memóriájában. Vagyis, az, amit a kezdet kezdetén a változók tanulásakor állítottam, szigorúan véve hazugság.

Annak idején agy dobozos metaforával mutattam be neked, hogy mi az a változó. Ez a metafora sok programozási nyelvben egyébként jól működik és igaz is. Ez a metafora nekünk, a Pythonban mostanáig jó volt, segített, de kitelt az ideje. Ha az objektumok tárolását pontosabban meg akarjuk érteni – márpedig meg akarjuk -, akkor pontosabb metaforára van szükségünk. (Más nyelvek felől érkezők számára fontos tudni, hogy a Pythonnak nincsenek primitívei, itt minden objektum – ha nem tanultál más nyelveket, akkor ne zavarjon, ha nem érted ezt a mondatot.)

Legyen az objektum például az ötös szám. Amikor azt mondom, hogy elért_pontszám = 5, akkor valójában

  • NEM hozok létre dobozt
  • NEM írom rá, hogy elért_pontszám
  • NEM teszek bele 5-öt a dobozba
  • HANEM elkülönítek egy részt a memóriában,
  • beleteszek 5-öt és
  • létrehozok egy elért_pontszám névcetlit (ez a hivatkozás), amit egy madzaggal a memóriában lévő helyre erősítek.

Az objektum lehet állandó értékű, ha tetszik: megváltoztathatatlan (angolul: immutable). Az eddig megismert objektumtípusok közül ilyen

  • az egész (int),
  • a karakterlánc (str),
  • a lebegőpontos, más néven valós (float)
  • és a logikai (bool).

Az, hogy ezek állandó értékűek, azt jelenti, hogy ha kiadom az ló_neve = 'Sanyi' parancsot, majd később a ló_neve = 'Gizike' parancsot, akkor:

  • NEM teszem dobozba azt hogy Sanyi, és
  • NEM írom felül a doboz tartalmát azzal, hogy Gizi,
  • HANEM létrehozok egy str objektumot, ‘Sanyi’ tartalommal,
  • kötök rá egy ló_neve feliratú cetlit,
  • majd létrehozok egy másik str objektumot, ‘Gizike’ tartalommal,
  • és átkötöm rá a cetlit (azaz: megváltoztatom a hivatkozás célpontját).

Mi lesz ‘Sanyi’-val? Ő még ott kuksol a memóriában, csak semmi nem mutat rá, más szóval nincs rá mutató hivatkozás. Akire nem mutat hivatkozás, azt megeszi a szemétgyűjtő (***gonosz röhögés***).

Mi van, ha ‘Sanyi’ – nak egyetlen betűjét akarom kicserélni? Add ki a ló_neve[1] = 'á' parancsot, és fogod látni, hogy nem megy! Próbáld ki, ne legyél lusta!

Az eddig megismert adattípusok között van egész pontosan egy olyan, ami változó értékű, ha tetszik: megváltoztatható (angolul: mutable). Ez a lista. A lista megváltoztatható. tudunk olyat, hogy új elemet fűzünk a végére, vagy átírjuk az egyik elemét:

lista = ['a', 'lista', 'megváltoztatható']
lista[1] = lista[1].upper()
lista.append('!')
print(lista) #['a', 'LISTA', 'megváltoztatható', '!']

Előzőleg a többdimenziós listákkal ismerkedtünk meg. Legközelebb a változók másolása következik.

Advertisements

Vélemény, hozzászólás?

Adatok megadása vagy bejelentkezés valamelyik ikonnal:

WordPress.com Logo

Hozzászólhat a WordPress.com felhasználói fiók használatával. Kilépés / Módosítás )

Twitter kép

Hozzászólhat a Twitter felhasználói fiók használatával. Kilépés / Módosítás )

Facebook kép

Hozzászólhat a Facebook felhasználói fiók használatával. Kilépés / Módosítás )

Google+ kép

Hozzászólhat a Google+ felhasználói fiók használatával. Kilépés / Módosítás )

Kapcsolódás: %s