Új hozzászólás Aktív témák

  • cousin333

    addikt

    válasz Tigerclaw #824 üzenetére

    Ugye milyen jó? :) Kár, hogy sajnos nem teljesen igaz... :U

    Szóval kicsit utána olvasgattam és az jött le nekem, hogy egyes típusok azért immutable-k, mert csak (nyilván emögött van elgondolás, az immutable objektum kb. olyan, mint valami konstans).. Nézzünk pár példát (az id függvény az adott objektum memóriabeli kezdőcímét adja vissza):

    >>> a = [1, 2, 3]
    >>> id(a)
    2238629696072
    >>> id(a[0])
    1970405872
    >>> id(a[1])
    1970405904
    >>> id(a[2])
    1970405936
    >>> type(a)
    <class 'list'>
    >>> type(a[0])
    <class 'int'>
    >>> b = (1, 2, 3)
    >>> id(b)
    2238629604520
    >>> id(b[0])
    1970405872
    >>> id(b[1])
    1970405904
    >>> id(b[2])
    1970405936

    A fenti esetben létrehoztam egy listát (a) és egy tuple-t (b), mindkettőt ugyanazzal a három elemmel. A címeket kiolvasva a következő megállítások tehetők:

    - az a és a b két külön objektum, egymástól viszonylag messze
    - mindkettő elemei int-ek és az elemek ugyanarra a memóriaterületre mutatnak!
    - magyarul csak egy darab 1-es van a memóriában, és mind a lista, mind a tuple ugyanarra hivatkozik
    - úgy tűnik az int objektum tárolására 32 bájtot használ a rendszer

    >>> b[1] = 4
    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    TypeError: 'tuple' object does not support item assignment
    >>> a[1] = 4
    >>> id(a)
    2238629696072
    >>> id(a[0])
    1970405872
    >>> id(a[1])
    1970405968
    >>> id(a[2])
    1970405936
    >>> id(b[1])
    1970405904
    >>> id(b[2])
    1970405936

    Itt azt látjuk, hogy a b második elemét nem engedi módosítani (hiszen az egy tuple eleme), az a-ét viszont igen, noha mindkettő ugyanarra az elemre mutatott! Ha a lista módosítása után is megnézzük a címeket, akkor azt látjuk, hogy az 1, 2 és 3 a "helyén" maradt, viszont a rendszer létrehozott egy új, 4 értékű int-et és az a[1] már erre hivatkozik.

    >>> c = "szoveg"
    >>> id(c)
    2238629677408
    >>> for x in c:
    ... print(id(x))
    ...
    2238534181640
    2238539112832
    2238534182144
    2238538540512
    2238534181696
    2238538838680

    A harmadik példa egy sztring objektum, aminek az elemei a memóriában nem egymás mellett, hanem elszórtan helyezkednek el. Ellentétben azzal, amit korábban írtam.

    Python data model: "The value of some objects can change. Objects whose value can change are said to be mutable; objects whose value is unchangeable once they are created are called immutable."

    ui: csak nekem tűnik randomnak a Programkód kapcsoló hatása?

    [ Szerkesztve ]

    "We spared no expense"

Új hozzászólás Aktív témák