Najlepsza odpowiedź
Pomyśl o samochodzie. Możemy (i często to robimy) prowadzić samochód bez zrozumienia, jak to działa. Większość ludzi nigdy nie patrzy na silnik samochodu, który znajduje się pod maską (w Ameryce nazywamy go maską , ale na przykład Brytyjczycy nazywają to maska ).
Oprócz silnika dostępna jest skrzynia biegów , który pobiera moc generowaną przez silnik i przekazuje do układu napędowego , który ostatecznie zabiera tę moc i kręci kołami. Większość ludzi nie rozumie żadnego z tych szczegółów ani nie musi tego robić, aby obsługiwać samochód.
Jako programista często warto wiedzieć, co się dzieje pod maską, ponieważ daje to wgląd w rzeczy, których nie widać.
Dwa przykłady Pythona, które mogą okazać się pomocne:
Zmienne w Pythonie są często wyjaśniane zaczynając programistów jako nazwane pola , w których można umieszczać dane. Więc kiedy piszesz
x = 1
w efekcie tworzysz pudełko, nadając mu nazwę x
i wstawiając 1 do pudełka. Kiedy później przyjrzysz się pudełku, zobaczysz, że jest w nim 1.
Jednak tak naprawdę nie o to chodzi pod maską . Zmienna x jest odniesieniem lub etykietą, która mówi, gdzie w rzeczywistości znajduje się 1. Pomyśl o karteczce z „x”, która jest przyklejona do pudełka zawierającego 1. Jeśli zdecydujesz się umieścić coś innego w pudełku, być może 2, Python utworzy zupełnie nowe pudełko i przesunie notatka z pierwszego pudełka do drugiego. Można to łatwo zademonstrować za pomocą funkcji id()
Pythona, która skutecznie informuje mnie, gdzie obiekt znajduje się w pamięci Pythona (to nie jest do końca prawdą, ale wymaga dygresji, która nie jest już pomocna za odpowiedź na pytanie).
>>> x = 1
>>> id(x)
4501308752
>>> x = 2
>>> id(x)
4501308784
Możesz zobaczyć, że x
był w określonym miejscu i kiedy Zmieniłem jego zawartość, x
faktycznie została przeniesiona. Dlaczego tak się dzieje, to kolejna dygresja, która również nie jest tutaj ważna. Faktem jest, że x przesunięte w tym sensie, że dane, do których odwołuje się x, znajdują się teraz w innym miejscu.
Początkujący programiści Pythona tego nie wiedzą, a co ważniejsze, nie muszą tego wiedzieć . Bardzo dobrze jest użyć analogii nazwanego pudełka.
Drugi przykład jest bardziej złożony i może być trudny do zrozumienia dla nowicjuszy.
Model danych Pythona odwzorowuje szereg tak zwanych funkcji wbudowanych na metody klas pod maską . Lubię to wyjaśniać, używając programu telewizyjnego Stranger Things jako punktu odniesienia. W tym programie jest do góry w dół , co przypomina alternatywny wszechświat, w którym rzeczy są rozpoznawalne, ale pomieszane. Rozważmy funkcję len()
w języku Python. Jest to wymienione w podręczniku jako Funkcja wbudowana , która zwraca liczbę elementów w czymś. Możesz obliczyć długość string
(czyli kontenera ), list
(także kontener) itd.
Początkujący programiści Pythona są zwykle uczeni, że len()
jest po prostu funkcją wbudowaną i działa na dowolny pojemnik. W rzeczywistości dzieje się pod maską , że Python tłumaczy wywołanie do len()
na metodę w do góry nogami o nazwie \_\_len\_\_()
. Jeśli obiekt, który przekazujesz do len()
, ma metodę \_\_len\_\_()
, zadziała. Jeśli nie, nie będzie. Dlatego na przykład nie można wywołać len()
na liczbie całkowitej:
>>> len(5)
Traceback (most recent call last):
File "
TypeError: object of type "int" has no len()
Początkujący programista Pythona rozumie, że oznacza to, że liczba całkowita nie jest kontenerem, a zatem nie ma co liczyć.Ale łatwo jest utworzyć typ liczby całkowitej, dla którego możemy wywołać funkcję len()
:
>>> class MyInt(int):
... # create an "upside down" method for len()
... def \_\_len\_\_(self):
... return 1
...
>>> x = MyInt(13)
>>> x
13
>>> len(x)
1
Utworzyłem nowy typ o nazwie MyInt
, zdefiniowałem zmienną x
typu MyInt
i był w stanie zadzwonić pod numer len()
. Mój len()
jest całkiem bezużyteczny (), ale udowadnia, że len()
można wywołać dla dowolnego obiektu, nie tylko „kontenera”. ” W praktyce, jako programista, mógłbym stworzyć własny obiekt Organization
, który reprezentuje firmę lub inną organizację. i mogę chcieć zadzwonić do len()
na obiekt Organization
i poprosić o zwrócenie liczby lat istnienia organizacji .
Więc rozumiejąc, co się dzieje pod maską, możemy pójść dalej jako programiści.
Odpowiedź
Myślę, że inni dobrze wyjaśnili, co „ pod maską ”oznacza ogólnie.
Kilka uwag do wyjaśnienia: komputer w swojej najprostszej postaci to procesor i pamięć główna. Procesory czytają bardzo szczegółowe instrukcje i przenoszą wartości w pamięci. Pamięć jest podzielona na niezliczone komórki, każda komórka ma adres.
„Pod maską” pamięć komputera wygląda następująco:
(Źródło: https://chortle.ccsu.edu/AssemblyTutorial/Chapter-10/memory01.gif)
Podczas pracy w języku wysokiego poziomu (zakładam, że pracujesz z Javą lub Pythonem lub coś podobnego), trudno zrozumieć, dlaczego tak się dzieje. Na przykład rozważmy listę połączoną. Być może zobaczyłeś obrazek bąbelków z liczbami ze strzałką wskazującą na inny bąbelek obok.
Coś takiego:
To wszystko dobrze i dobrze pomaga zrozumieć, jak działają listy połączone w porównaniu, powiedzmy, z tablicą; jednak „pod maską” jest zupełnie inaczej.
Jak powiedzieliśmy, wszystko w komputerze to komórki pamięci z wartościami. Węzeł z połączoną listą, podczas wizualizacji w pobliżu swojego sąsiada, może znajdować się setki lub tysiące bajtów od swojego sąsiada. Pod maską strzałki, które widzisz na obrazku, są w rzeczywistości wskaźnikami, a wskaźnik może odnosić się do dowolnej komórki w pamięci. W szczególności wskaźnik odwołuje się do adresu następnego węzła na liście.
Mam nadzieję, że ten przykład pomoże wyjaśnić, o czym on mówi.