W tym artykule opisane zostaną podstawowe pojęcia jak obiekty, referencję i dynamiczne typowanie w Python’ie.

1. Obiekty

Dane każdego programu w Python’ie przechowywane są za pomocą obiektów oraz relacji między nimi.  Każdy obiekt posiada trzy własności: unikalny identyfikator (czasem  nazwany  tożsamością), który nigdy się nie zmienia (można go interpretować jako adres obiektu w pamięci), a także typ (również niezmienny w czasie życia obiektu) oraz określoną wartość.

Jeżeli wartości obiektu po jego utworzeniu także nie można zmienić  to mamy do czynienia z tak zwanym obiektem niemutowalnym (ang. immutable), w przeciwnym razie jest to obiekt mutowalny (ang. mutable).

Mutowalność określa sam typ obiektu: przykładowo, obiekty typów  numerycznych (jak int czy float), łańcuchów znakowych (str) oraz krotek (tuple) są niemutowalne, natomiast można modyfikować listy (list) oraz słowniki (dict). Obiekty tworzone przez użytkownika (instancje klas) są zwykle mutowalne. Szczegółowo o podstawowych typach danych napiszemy w kolejnych częściach.

Gdy trzeba zmodyfikować wartość zmiennej typu niemutowanego, to tworzony jest po prostu nowy obiekt danego  typu i przypisywany tej zmiennej (tak, by wskazywała na ten nowy obiekt). Mutowalność ma także znaczenie przy przekazywaniu zmiennych do funkcji: możemy przekazywać zmienne zarówno mutowalne jak i niemutowalne, lecz należy pamiętać iż w funkcji tej nie zmodyfikujemy przekazanych  obiektów typów niemutowanych.

Wszystkie typy niezmienne (immutable) są także haszowalne (hashable): oznacza to, że posiadają metodę __hash__, która zwraca określoną wartość, niezmienną przez cały okres „życia” obiektu. Tylko obiekty haszowalne mogą być  użyte jako klucze w słownikach (dict)  oraz elementy zbiorów (set). Z wbudowanych typów Python’a jedynie lista (list) oraz słownik (dict) są niehaszowalne, z kolei obiekty tworzone przez użytkownika domyślnie są haszowalne.

2. Referencje

W Python’ie referencje to byty „wskazujące” na obiekty określonego typu.  Nazwane referencje (o nadanej, określonej nazwie) będą zwane dalej zmiennymi. Referencja „wskazuje” na odpowiedni obszar pamięci w którym znajduje się obiekt określonego typu.  Wspomniane wyżej przekazywanie obiektów  do  funkcji realizowane jest właśnie przez  referencje.

Aby się o tym przekonać wystarczy wpisać w konsoli następujący przykład:

>>> def wypisz(a):
>>>     print("przekazana wartosc a =",a,", id a =",id(a))
>>> x=123
>>> print(id(x))
505306344
>>> wypisz(x)
przekazna wartosc a = 123 , id a = 505306344

Powyższy przykład deklaruje funkcje „wypisz” z jednym parametrem, której jedynym zadaniem jest wypisanie przekazanej poprzez parametr „a” wartości. Użyta tu wbudowana funkcja id zwraca unikalny identyfikator obiektu, zwykle jest to reprezentacja adresu, pod którym obiekt znajduje się w pamięci operacyjnej. Przed wywołaniem funkcji tworzona jest zmienna „x”, której przypisana jest wartość liczbowa 123. Następnie dwukrotnie wywoływana jest wbudowana funkcja id: najpierw bezpośrednio a następnie w samej funkcji  wypisz. Widać, że wypisywana przez id wartość jest identyczna, a więc  mamy do czynienia z jednym i tym samym obiektem.

W Python’ie nie trzeba martwić się o niszczenie nieużywanych obiektów: działająca na zasadzie zliczania referencji „śmieciarka” (ang. garbage collector) zwolni obszar pamięci jeżeli obiekt, który go zajmował nie jest już używany (w uruchomionym programie nie ma już więcej referencji wskazujących na ten obiekt).

3. Dynamiczne typowanie

Python jest językiem o tak zwanym dynamicznym typowaniu: w przeciwieństwie do języków o typowaniu statycznym (takich jak C/C++ czy Java) nie trzeba w nim jawnie deklarować typu tworzonej zmiennej.  Język sam określi typ korzystając z kontekstu, przykładowo pisząc:

>>> a = 3
>>> x = ‘znaki’

Zostaną utworzone dwie zmienne:  zmienna „a” typu int (liczba całkowita) oraz „x” typu str (łańcuch znakowy) i  zostaną im przypisane odpowiednie wartości.

Referencja nie jest przypisana utworzonemu raz obiektowi aż do jego „śmierci”, w każdej chwili możemy spowodować by wskazywała na obiekt  innego typu, np.

>>> a = ‘teraz to zmienna typu str’

W następnej części opiszemy wbudowane w język, podstawowe typy danych i odpowiednie operatory.