Zrozumienie systemu typów w Pythonie jest kluczem do rozwiązania tego trudnego błędu.

Próbujesz pobrać dane z obiektu i zamiast tego widzisz błąd „obiekt nie podlega subskrypcji”? Problem polega na tym, że indeksujesz niewłaściwy typ danych.

Dowiedz się wszystkiego o typach, które można subskrybować i jak rozwiązać ten błąd.

Co oznacza „podlegający subskrypcji” w Pythonie?

Termin „subscriptable” w Pythonie oznacza typ danych, który przechowuje wiele wartości, do których można uzyskać dostęp indywidualnie. Możesz uzyskać dostęp do określonej wartości z typu danych z możliwością indeksowania poprzez jego indeks, używając notacji nawiasów kwadratowych ([]).

Jeśli spróbujesz uzyskać dostęp do elementów w typie danych, którego nie można indeksować, Python zgłasza wyjątek „TypeError: obiekt nie podlega indeksowaniu”.

Następujące typy danych są indeksowalne w Pythonie: listy, ciągi znaków, krotki i słowniki.

przykład_listy = [1, 3, 5, "Idowu"]
ciąg_przykład = „Idowu Omisola”
przykład_krotki = (1, 3, 5, "Idowu")
dict_example = {"nazwa": "Idowu", "Język": „Joruba”}
instagram viewer

drukuj (list_example[0]) # 1
drukuj (string_example[3]) # w
drukuj (tuple_example[1]) # 3
drukuj (dict_example["nazwa"]) #Idowu

Jednak zestawy, liczby całkowite, zmiennoprzecinkowe i logiczne są niedostępne przez indeksowanie, więc nie można ich subskrybować:

przykład_zmiennoprzecinkowy = 12.45
int_przykład = 12367
bool_przykład = PRAWDA
set_example = {1, 3, 5, "Pyton"}

drukuj (float_example[1])
drukuj (bool_example[2])
drukuj (int_example[2])
drukuj (set_example[2])

Próba uruchomienia każdej z tych instrukcji powoduje wyświetlenie wyjątku „obiekt nie podlega subskrypcji”:

Rozwiązanie wyjątku

Rozwiązanie wyjątku „obiekt nie podlega subskrypcji” jest łatwiejsze, gdy zrozumiesz zasady dostępu do każdego typu danych. Rozpocznij więc debugowanie w Pythonie, sprawdzając typ danych obiektu, który próbujesz zindeksować.

przykład_zmiennoprzecinkowy = 12.45
int_przykład = 12367
bool_przykład = PRAWDA
set_example = {1, 3, 5, "Pyton"}

print (typ (float_example)) #
drukuj (typ (int_example)) #
print (typ (bool_example)) #
print (typ (set_example)) #

Po ustaleniu, że typ danych nie jest subskrypcyjny, przekonwertowanie go na typ indeksowalny rozwiązuje problem. Jest to przydatne, jeśli dane pochodzą z API strony trzeciej. Konwersja typów danych, takich jak liczba całkowita, liczba zmiennoprzecinkowa i wartość logiczna, na łańcuch znaków umożliwia ich subskrypcję:

print(str (float_example)[:2]) # 12
print(str (int_example)[:2]) # 12
print (str (bool_example)[:2]) #Tr

Możesz nawet manipulować wynikowymi łańcuchami Pythona jak chcesz. Jeśli masz do czynienia z liczbami całkowitymi i zmiennoprzecinkowymi, możesz chcieć zachować oryginalny typ danych na wyjściu. Aby to zrobić, przekonwertuj wynikową wartość na oryginalny typ danych po zindeksowaniu ich jako łańcuchów:

przekonwertowana_liczba = liczba zmiennoprzecinkowa (str (przykład_zmiennoprzecinkowa)[:2])
przekonwertowany_int = int (str (int_example)[:2])

# 12.0 Typ danych:
drukuj (converted_float, f'Typ danych:{typ (converted_float)}')

# 12 Typ danych:
drukuj (przekonwertowany_int, f'Typ danych:{type (converted_int)}')

Jeśli chodzi o zestaw, możesz go przekształcić w listę. Chociaż możesz przekonwertować ustawiony obiekt na listę za pomocą lista (zestaw) Python one-liner, to nie zachowuje pozycji elementów na wynikowej liście. Aby mieć pewność, że otrzymasz listę z zachowanymi pozycjami elementów, użyj funkcji lambda Pythona w następujący sposób:

set_example = {1, 3, 5, "Pyton"}
przekonwertowane = posortowane (set_example, key=lambda x: (jestinstancja (x, str), x))

drukuj (przekonwertowany[3]) # Pythona

Mistrzowskie debugowanie Pythona

Python ma płynną krzywą uczenia się. Ale proste wyjątki mogą cię zniechęcić, jeśli nie wiesz, jak sobie z nimi poradzić. Nauka debugowania kodu i poświęcanie czasu na rozwiązywanie problemów znacznie ułatwia naprawianie błędów i wyjątków w kodowaniu Pythona.