Egyről a kettőre

Ma lesz a napja, hogy változókat másolunk meg objektumhivatkozások célpontjait módosítjuk: egy objektumból kettőt csinálunk.

Állandó értékű típusok esetében


a = 'valami'
b = a
a = 'másvalami'
print(a, b)
b = None

Fussuk át a kódot:

  1. az első sor miatt
    • a memóriában lefoglalódik egy rész, és beleíródik, hogy ‘valami’: létrejön egy karakterlánc, azaz string típusú objektum
    • létrejön hozzá egy objektumhivatkozás a néven
  2. a második sor miatt
    • az előző memóriaterülethez létrejön egy második objektumhivatkozás is, b néven
  3. a harmadik sor miatt
    • a memóriában lefoglalódik egy rész, és beleíródik, hogy ‘másvalami’
    • az a objektumhivatkozás célpontja megváltozik erre az új objektumra
  4. a negyedik sor miatt
    • kiíródik a képernyőre, hogy másvalami valami
  5. az ötödik sor miatt
    • a b objektumhivatkozás és a ‘valami’ karakterlánc-objektum közötti kapcsolat megszűnik
    • így erre az objektumra már nem mutat több objektumhivatkozás, azaz előbb utóbb a szemétgyűjtő (garbage collector) felszabadítja az általa lefoglalt memóriát

Változó értékű típusok esetében


lista = ['valami', 'cucc']
másik_lista = lista
lista[0] = 'másvalami'
print(lista, másik_lista)
harmadik_lista = list(lista) #vagy: haramdik_lista = lista[:]
lista[0] = 'megint más'
print(lista, másik_lista, harmadik_lista)

  1. az első sor miatt
    • a memóriában lefoglalódik egy rész, és létrejön egy lista típusú objektum
    • létrejön hozzá egy objektumhivatkozás lista néven
  2. a második sor miatt
    • az előző memóriaterülethez létrejön egy második objektumhivatkozás is, másik_lista néven
  3. a harmadik sor miatt
    • megváltozik az objektum 0. eleme
      (Nem a lista 0. eleme, vagy a másik_lista 0. eleme, hiszen ezek csak hivatkozások az objektumra!)
  4. a negyedik sor miatt
    • kiíródik, hogy ['másvalami', 'cucc'] ['másvalami', 'cucc']
  5. az ötödik sor miatt
    • a memóriában lefoglalódik egy rész, és létrejön egy másik lista típusú objektum, ami az előző objektum másolatát tartalmazza
      (Ekkor épp három objektumhivatkozásunk, de csak két objektumunk van – az első két hivatkozás ugyanarra a listára mutat!)
  6. a hatodik sor miatt
    • az első objektum 0. eleme megváltozik
  7. a hetedik sor miatt
    • kiíródik, hogy ['megint más', 'cucc'] ['megint más', 'cucc'] ['másvalami', 'cucc']

Előzőleg a kiderült, hogy mi az az objektumhivatkozás. Legközelebb hatókörrel és láthatósággal foglalkozunk.

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