Python to język zorientowany obiektowo, dlatego dobre zrozumienie natury obiektów oraz ich właściwości stanowi podstawę posługiwania się tym językiem. Obiekty w Pythonie można podzielić zgodnie z określonymi kategoriami. Obiekty z tej samej kategorii współdzielą metody – na przykład obiekty należące do sekwencji, takie jak łańcuchy znaków, listy lub krotki mają metody umożliwiające sprawdzanie długości, indeksowanie czy konkatenację.
Co warto wiedzieć o obiektach?
Obiekty są elastyczne
Obiekty służące do gromadzenia elementów, takie jak listy, słowniki oraz krotki, są elastyczne, a więc mogą zawierać dowolne elementy (jedynie w przypadku zbiorów mogą to być tylko elementy niemutowalne), a także mogą być zagnieżdżane. Listy, słowniki oraz zbiory mogą rosnąć się lub kurczyć w miejscu, bez konieczności przepisywania do nowej zmiennej. Innymi słowy są one mutowalne (krotki nie mogą być zmienanie, są zatem niemutowalne).

Obiekty przechowują referencje, a nie kopie
Przypisanie obiketu do zmiennej przechowuje referencję do obiektu, a nie jego kopię. Stworzenie wielu referencji do tego samego obiektu, który może być zmieniony w miejscu (jak np. lista), może dać nieoczekiwane rezultaty, a krótko mówiąc wpłynie na inne referencje:
>>> L = [1, 2, 3]
>>> L2 = ['a', 'b', 'c']
>>> D = {1: L, 2: L2}
>>> L[0] = 'nowa wartość'
>>> D
{1: ['nowa wartość', 2, 3], 2: ['a', 'b', 'c']}
Jak widać w powyższym przykładzie ze względu na to, że w słowniku znalazła się referencja do listy, a więc obiektu mutowalnego, to przy wprowadzeniu do niej zmian doszło również do zmiany zawartości słownika.
Jeśli chcemy uniknąć takiego zachowania, powinniśmy stworzyć kopię obiektu, co jest możliwe za pomocą:
- Metody copy(), która kopiuje słowniki, zbiory oraz listy,
- Wyrażenia z wycinkami z pustymi granicami typu S[:], L[:], co pozwala na kopiowanie sekwencji,
>>> D = {1: L[:], 2: L2}
>>> L[0] = 'ponowa zmiana'
>>> L
['ponowa zmiana', 2, 3]
>>> D
{1: ['nowa wartość', 2, 3], 2: ['a', 'b', 'c']}
- Wywołanie wbudowanej funkcji konwertującej, taki jak list(), dict() czy set(), czyli po prostu do zmiennej przypisujemy przekonwertowaną listę, słownik lub zbiór,
- Wykorzystanie modułu copy, który znajduje się w bibliotece standardowej.
- Uwaga! Dla wykonywania kopii złożonych obiektów należy skorzystać z tzw. głębokich kopii, czyli metody deepcopy() z modułu copy.
Jak w Pythonie przeprowadzane są porównania oraz testy równości obiektów: == oraz is?
Obiekty można porównywać pod względem równości czy wielkości. W przypadku obiektów złożonych porównywane są wszystkie części dopóki nie uzyska się wyniku. Gdy program napotka pierwszą różnicę, wówczas zwraca wynik. Jest to tak zwane porównanie rekurencyjne, gdzie obiekty są porównywane ze sobą po kolejnych elementach ich zawartości.
Porównanie typu ==
Jest to rodzaj porównania, który sprawdza równość wartości. Sprawdza zatem, czy wartość obiektu, do którego odwołują się obie zmienne, jest równa.
>>> L = [1, ('a')]
>>> L2 = [1, ('a')]
>>> L == L2
True
Porównanie typu is
Jest to rodzaj porównania, który sprawdza identyczność obiektów. Oznacza to sprawdzanie, czy dwa obiekty, do których odwołują się zmienna, rzeczywiście znajdują się pod tym samym adresem w pamięci. Żeby zmienne były identyczne, obie muszą odwoływać się do tego samego obiektu.
>>> L is L2
False
>>> a = L
>>> b = L
>>> a is b
True
Co ciekawe, porównanie typu is może działać inaczej w przypadku niektórych wartości, zwłaszcza tych małych, które są umieszczane w pamięci podręcznej.
>>> S1 = 'abc’
>>> S2 = 'abc’
>>> S1 == S1, S1 is S2
(True, True)
Jak widać, chociaż obie zmienne nie odwołują się do tego samego łańcucha znaków, to w celu optymalizacji tak są właśnie traktowane.
Obiekty można również ze sobą porównywać:
>>> L = [1, ('a', 'b')]
>>> L2 = [1, ('a', 'c')]
>>> L2 > L
True
Jak porównywane są poszczególne typy obiektów?
- liczby porównuje się zgodnie z ich względną wielkością po przeprowadzeniu konwersji do najwyższego typu wspólnego,
- łańcuchy znaków są porównywane leksykograficznie, czyli według kodów znaków zwracanych przez funkcję ord(), a także od lewej do prawej, znak po znaku,
- listy i krotki są porównywane poprzez zestawienie każdego elementu od lewej do prawej strony, a także rekurencyjnie dla struktur zagnieżdżonych aż do znalezienia pierwszego niedopasowania:
>>> [3] > [2, 3, 4, 5]
>>> True
- zbiory są równe, jeśli zawierają te same elementy, a ich porównania wykorzystują testy podzbioru i nadzbioru, dzięki czemu można wykonywać na nich matematyczne działania na zbiorach,
- słowniki są uznawane za równe, jeśli ich posortowane listy, składający się z krotek (klucz, wartość) są sobie równe, natomiast porównywanie słowników za pomocą prostej metody nie jest dostępne w wersji 3.x,
- porównywanie różnych typów, czyli typów nielicznych, jest niedozwolone.
Jak mimo wszystko sortować słowniki w Pythonie 3.x?
Skoro nie istnieje wbudowana metoda na sortowanie słowników w nowszych wersjach Pythona, należy skorzystać z samodzielnie opracowanych sposobów. Jednym z nich jest zamiana kluczy i wartości słownika na listę krotek, a następnie posortowanie listy i porównanie dwóch list ze sobą.
>>> D = dict(a=1, b=2)
>>> D2 = dict(a=1, b=3)
#zamiana wartości na listę i posortowanie jej:
>>> list_D = sorted(list(D.items()))
>>> list_D2 = sorted(list(D2.items()))
>>> list_D > list_D2
False
>>> list_D < list_D2
True
Prawda oraz fałsz, czyli conieco o True i False
Wartości boolean: True i False są używane do przeprowadzania testów logicznych. Wartość False jest reprezentacją liczby 0, natomiast wartość True odpowiada liczbie 1. Dowolny niepusty obiekt w Pythonie lub każda inna liczba niż 0 są interpretowane jako prawda. Każda pusta struktura danych oraz liczba 0 będą zatem uznawane za fałsze. Z tego względu często w instrukcjach warunkowych nie są stosowane zapisy typu if x !== 0:…, tylko po prostu if x:… Jako fałsz zawsze interpretowany jest również specjalny obiekt None.
Fałsz:
- pusty obiekt,
- liczba 0,
- obiekt None.
Prawda:
- wszystko inne.
Obiekt None
Obiekt None jest określany mianem zastępczego pustego obiektu. Może posłużyć na przykład do tego, aby zbudować listę składającą się z wielu obiektów, których wartości jeszcze nie znamy. Należy przy tym pamiętać, że obiekt None nie jest tak naprawdę niczym, ponieważ zajmuje miejsce w pamięci.
Typ bool
Typ Boolean został wprowadzony po to, aby w bardziej intuicyjny sposób reprezentować wartości prawdy i fałszu. Dzięki niemu zamiast 0 i 1 otrzymujemy wartości True i False.
Funkcja type – sprawdzanie typu obiektu
Wywołania nazwy obiektów, takich jak int(), str() czy list() tak naprawdę nie wywołują funkcji konwersji, ale konstruktor obiektu danej klasy. Sprawdzanie typu danego obiektu można wykonać na dwa sposoby:
Poprzez funkcję type(obiekt)
>>> type(D)
<class 'dict'>
Poprzez funkcję isinstance(obiekt, typ)
>>> isinstance(D, dict)
True
W następnym poście dowiemy się więcej o instrukcjach w Pythonie 🙂
Dodaj komentarz
Musisz się zalogować, aby móc dodać komentarz.