A legjobb válasz
Gondoljon egy autóra. Vezethetünk (és gyakran is csinálunk) egy autót anélkül, hogy megértenénk annak működését. A legtöbb ember soha nem nézi az autó motorját, amely a motorháztető alatt él (Amerikában motorháztetőnek nevezzük), de például a brit emberek motorháztető ).
A motor mellett van egy sebességváltó , amely átveszi a motor által generált energiát, és továbbítja azt a hajtáslánc -nak, ami végül ezt az erőt veszi és megfordítja a kerekeket. A legtöbb ember nem érti ezeket a részleteket, és nem is kell nekik ahhoz, hogy gépjárművet működjenek.
Programozóként gyakran hasznos tudni, hogy mi történik a motorháztető alatt, mert betekintést nyújt olyan dolgokba, amelyeket nem lát.
Két olyan Python-példa, amelyek hasznosak lehetnek:
A Pythonban található változókat gyakran elmagyarázzák a kezdő programozóknak megnevezett dobozoknak , amelyekbe adatokat helyezhet el. Tehát amikor írsz
x = 1
tulajdonképpen létrehozsz egy dobozt, és elnevezed azt x
és betesz egy 1-et a dobozba. Amikor később megvizsgálja a dobozt, azt találja, hogy van benne 1.
Azonban valójában nem ez történik a motorháztető alatt . Az x változó egy hivatkozás vagy címke, amely megmondja, hogy az 1-et valójában hol tárolja a memória. Gondoljon egy cetlire, rajta egy „x” betűvel, amely az 1-es dobozra van ragasztva. Ha úgy dönt, hogy valami mást tesz a dobozba, esetleg egy 2-t, a Python létrehoz egy teljesen új dobozt, és áthelyezi a ragasztót jegyzet az első rovatból a másodikba. Ezt könnyű bemutatni a Python id()
függvényével, amely hatékonyan megmondja, hol él egy objektum a Python memóriájában (ez nem feltétlenül igaz, de olyan eltérést igényel, amely már nem hasznos a kérdés megválaszolásához).
>>> x = 1
>>> id(x)
4501308752
>>> x = 2
>>> id(x)
4501308784
Láthatja, hogy x
egy adott helyen volt, és mikor Megváltoztattam a tartalmát, x
valójában elmozdult. Miért történik ez, az egy újabb kitérés, amely itt szintén nem fontos. Az a tény, hogy x abban az értelemben mozgott, hogy az x-re hivatkozott adatok most más helyen vannak.
A Python kezdő programozói ezt nem tudják, és ami még ennél is fontosabb, ezt nem kell tudniuk . Teljesen rendben van, ha egy elnevezett doboz analógiáját használjuk.
A második példa összetettebb, és az újonnan érkezők számára esetleg nehezen fogható meg.
A Python adatmodell számos úgynevezett beépített függvényt sorol fel a osztály metódusokra a motorháztető alatt . Szeretem elmagyarázni, ha a Stranger Things című tévéműsort referenciapontként használom. Ebben a műsorban van egy fejjel lefelé lefelé , amely olyan, mint egy alternatív univerzum, amelyben a dolgok felismerhetők, de elrontottak. Tekintsük a Python len()
függvényt. Ez a kézikönyvben Beépített funkció néven szerepel, amely visszaadja valamiben az elemek számát. Kiszámíthatja egy string
(amely egy tároló ), egy (egy tároló is), és így tovább.
A kezdő Python programozóknak általában azt tanítják, hogy a len()
egyszerűen beépített függvény, és tovább működik bármilyen tartály. Valójában az történik, hogy a motorháztető alatt az az, hogy a Python egy hívást len()
-re fordít a fejjel lefelé , az úgynevezett \_\_len\_\_()
. Ha a len()
számára átadott objektum \_\_len\_\_()
módszerrel rendelkezik, akkor ez működni fog. Ha nem, akkor nem. Ezért például nem hívható a len()
egész számra:
>>> len(5)
Traceback (most recent call last):
File "
TypeError: object of type "int" has no len()
A kezdő Python programozó ezt úgy érti, hogy egy egész szám nem konténer, ezért ez nem számít.De könnyű létrehozni egy egész típusú típust, amelyhez hívhatjuk a len()
függvényt:
>>> class MyInt(int):
... # create an "upside down" method for len()
... def \_\_len\_\_(self):
... return 1
...
>>> x = MyInt(13)
>>> x
13
>>> len(x)
1
Létrehoztam egy új típust MyInt
néven, meghatároztam egy x
típusú MyInt
típusú, és képes volt felhívni a len()
hívást. Az én len()
-em elég haszontalan (), de azt bizonyítja, hogy a len()
-et bármilyen objektumra lehet meghívni, nem csak „tárolóra”. ” A gyakorlatban programozóként létrehozhatom a saját objektumomat Organization
, amely egy üzleti vagy más szervezetet képvisel. és szeretném, ha képes lennék felhívni a len()
-t egy Organization
objektumra, és visszaadhatnám a szervezet létezésének számát .
Tehát ha megértjük, hogy mi történik a motorháztető alatt, programozóként tovább léphetünk. a motorháztető alatt ”általában azt jelenti.
Néhány megjegyzés, hogy tisztázzuk: a számítógép a legegyszerűbb formájában a processzor és a fő memória. A processzorok nagyon konkrét utasításokat olvasnak, és kb. A memória számtalan cellára van felosztva, minden cellának van címe.
„A burkolat alatt” a számítógép memóriája így néz ki:
(Forrás: https://chortle.ccsu.edu/AssemblyTutorial/Chapter-10/memory01.gif)
Magas szintű nyelven végzett munka esetén (feltételezem, hogy Java vagy Python vagy valami hasonló) nehéz megérteni, hogy a dolgok miért vannak úgy, ahogy vannak. Vegyünk például egy összekapcsolt listát. Előfordulhat, hogy olyan buborékok képét mutatják, amelyekben számok vannak, és a nyíl egy másik buborékra mutat mellette.
Valami hasonló:
Ez nagyon jó és jó annak megértéséhez, hogy a kapcsolt listák hogyan működnek, mondjuk egy tömbhöz képest; azonban a „motorháztető alatt” sokkal másabb.
Mint mondtuk, a számítógépben minden olyan értékmemória. A csatolt listacsomópont, bár a szomszédja közelében látható, több száz vagy ezer bájt távolságra lehet szomszédjától. A motorháztető alatt a képen látható nyilak valójában mutatók, és egy mutató utalhat a memória bármely cellájára. Különösen a mutató hivatkozik a lista következő csomópontjának címére.
Remélem, hogy ez a példa tisztázza, miről beszél.