Dziś dopowiedzmy sobie i uściślijmy kilka pojęć widocznych w tytule tego posta. Poruszymy temat obiektów, wartości i zmiennych, by podsumować sobie wiedzę, a także uściślić powyższe byty programistyczne. Są to jedne z podstawowych pojęć w programowania, wszak zmienne to jedna z rzeczy od których zwykle zaczynamy naukę programowania.
W trakcie Naszej podróży już nie raz, i nie dwa mieliśmy do czynienia z tymi tematami,. Jednak nie zajmowaliśmy się nimi wprost. Po prostu przy okazji wykorzystywaliśmy je tutaj, używając rzeczy, o których za moment sobie porozmawiamy. Intuicyjnie rozumieliśmy te koncepcje, bo nie były, na podstawowym poziomie, jakoś specjalnie skomplikowane. Bywają te pojęcia jednak ze sobą mylone.
Wracamy więc niejako do podstaw, i szlifujemy je jeszcze raz, co przywodzi mi na myśl słynną książkę „7 nawyków skutecznego działania” i koncepcję powracania do początku i ulepszania. W wolnych chwilach polecam, jeśli nie czytałeś.
Obiekt i jego wartość
Wracając do naszych programistycznych tematów, odłóżmy dygresję na bok Jak pewnie już wiesz Python to język, w którym wszystko jest obiektem. Zatem na pewno domyślasz się już, że wymienione w tytule rzeczy to też obiekt.
Jeśli przykładowo stworzymy zmienną a i przypiszemy jej wartość jeden. Możemy wtedy powiedzieć, że zmienna a jest równa jeden. Inaczej wartość zmiennej a wynosi jeden. Mamy tutaj jednak do czynienia z pewnym uproszczeniem. Bowiem to co właśnie napisałem jest prawdą, ale… jeśli pójdziemy w to dalej, to.. Okazuje się, że tak naprawdę Python stworzył obiekt o wartości 1 (liczba jeden jest obiektem). Następnie na ten obiekt jeden, dzięki instrukcji przypisania, zaczęła wskazywać zmienna a.
Powyższy kod, w linijce pierwszej prezentuje omawianą sytuację. Dokładnie możemy powiedzieć, że zmienna a, wskazuje na obiekt o wartości jeden. Co to w praktyce znaczy? Wyobraź sobie, że szukasz jakiegoś pojęcia w książce. Zaglądasz do indexu na końcu książki. Znajdują się tam pojęcia i odwołania so stron, na których były wykorzystywane. Podobnie działa tutaj zmienna o nazwie a.
Możemy powiedzieć, że ogólnie, obiekt w Pythonie to instancja klasy, która przechowuje zarówno dane, jak i metody związane z danym typem danych. Jest to po prostu jakgdyby pojemnik na coś, pojemnik typu takiego, jak rzecz w środku. Znaczy to, że powyższy obiekt jest typu int, czyli typu liczb całkowitych, bo taka jest jego wartość.
Typ obiektu
Jak widzimy, obiekt z wartością 1 jest właśnie obiektem klasy int. Czyli po prostu ma typ int. Zatem istnieje sobie gdzieś w pamięci (gdzieś w książce jest) obiekt z liczbą jeden. Teraz, do tego obiektu możemy się dostać właśnie dzięki zmiennej, która wskazuje jego miejsce w pamięci. Tak samo jak index w książce wskazuje stronę z pojęciem.
Mamy tutaj sytuację, że na podstawie wbudowanej klasy int, został stworzony obiekt tej klasy. Mamy zatem obiekt typu int. Został stworzony obiekt zmiennej, która poprzez przypisanie zaczęła wskazywać na ten właśnie obiekt z liczbą int.
Instrukcja type mimo, że użyta na zmiennej, to nie sprawdziła samej zmiennej. Instrukcja ta, poprzez użycie na zmiennej, sprawdziła sam typ obiektu, na jaki zmienna wskazuje. Mówimy tutaj inaczej, że zmienna jest referencją do obiektu. Znaczy to właśnie, że „referuje” do tego obiektu, czyli go wskazuje. Gdyby na obiekt nic nie wskazywało, to po prostu istniałby on sobie, ale nie moglibyśmy się do niego dostać. Inna sprawa, że taki obiekt nieużywany przez nikogo, jest niepotrzebny, więc Python usuwa go z pamięci.
Bardziej obrazowe ujęcie zmiennych, obiektów i ich wartości
Powyższą koncepcję, można trochę lepiej sobie uświadomić patrząc na poniższą ilustrację (mam nadzieję).
Gdy w kodzie będziemy mieli linijkę a = 1, w pamięci zostanie utworzony obiekt int o wartości 1, a zmienną a będzie na niego zskazywać. Gdy taką samą linijkę będziemy mieli, ale przypisującą 2, stanie się to samo, tylko z liczbą 2. Jeśli pojawią się dwie zmienne, przykładowo a i b, z przypisaną tą samą wartością – obie będą wskazywać na jeden obiekt z daną wartością. Możemy to potwierdzić sprawdzając adres przechowywany w zmiennych.
Jak widzimy powyżej, obie zmienne przechowują tą samą wartość, a jest to id, czyli identyfikator, obiektu. Łatwo z tego wnioskujemy, że skoro obie liczby są takie same, to musi być to jeden i ten sam obiekt. I w rzeczywistości tak właśnie jest, obie zmienne wskazują na jeden obiekt. Jest to pewna oszczędność pamięci, ponieważ nie posiadamy dwu obiektu z tą samą wartością.
Zmienna
Myślę, że już intuicyjnie rozumiesz czym jest zmienna w języku Python. Używaliśmy tego pojęcia już wiele razy. Niemniej w ramach podsumowania, powiedzmy sobie, że zmienna to jedynie sposób na odwołanie się do obiektu, przechowującego jakąś wartość. W wielu językach to zmienna jest kontenerem na pewną wartość. Tutaj mamy trochę odwrotnie, bo to obiekt jest kontenerem na coś, a zmienna się tylko do niego odnosi.
Wszystko jest obiektem
Jak wspomnieliśmy, w Pythonie wszystko jest obiektem. Skoro już to wiemy, a wiemy także, że zmienna tylko wskazuje na obiekt. I jeśli także liczba jest obiektem, stworzonym na podstawie wbudowanej klasy, a znamy już trochę klasy. Może pojawić się pytanie o to, czy taka wbudowana klasa ma jakieś metody lub właściwości. I owszem ma. Możemy je wszystkie sprawdzić, gdy na obiekcie takiej klasy wbudowanej użyejmy funkcji dir(). Powinniśmy wtedy dostać listę tych właściwości i funkcji danej klasy.
Powyżej można zauważyć jak wiele różych właściwości i funkcji ma klasa obiektu int, a w wyniku tego sam obiekt wspomnianej klasy. W wyniku funkcji dir będziemy widzieć zestawy atrybutów każdej klasy. Jeśli użyjemy dir na obiekcie int – otrzymamy atrybuty klasy int. Jeśli na obiekcie typu string – otrzymamy atrybuty klasy str. Pokazuje to Nam, że nawet taki łańcuch znaków, jest obiektem.
Funkcja jako obiekt
Obiektem jest także funkcja, co można sobie uświadomić obserwując działanie poniższego kodu.
Widzimy na nim, że jeśli sprawdzimy typ samego bytu jakim jest funkcja, to otrzymamy odpowiedź, że jest to klasa 'function’. Sugeruje to, że funkcja została stworzona na podstawie klasy o nazwie function. Jeśli natpmiast wyświetlimy sam byt funkcji, podając jej nazwę, dowiemy się pod jakim adresem bytuje ten obiekt, jakims jest funkcja.
Na zadanie domowe przetestuj, co się dzieje, gdy przypiszesz tę samą wartość kilku zmiennym, a następnie zmodyfikujesz jedną z tych wartości. Sprawdź również, jak zmieniają się identyfikatory obiektów (id
) przy różnych operacjach. Co stanie się po użyciu dir na obiekcie funkcji? Co jeśli przypiszesz nazwę funkcji do zmiennej? Jak zawsze pobaw się tym 😉
2 komentarze do “Myśląc o Pythonie: Obiekt, wartość i zmienna”