Napraw obiekt „Int” nie można subskrybować w Pythonie

W tym artykule przeanalizujemy, jak naprawić obiekt „int”, którego nie można subskrybować w Pythonie. Ale wcześniej zrozummy, dlaczego tak się dzieje i co to oznacza.

Co to jest obiekt „Int”? Czy nie jest to błąd subskrypcyjny?

Błąd Obiekt „int” nie podlega indeksacji występuje, gdy próbujesz użyć indeksowania lub krojenia na pliku liczba całkowita , typ danych, który nie obsługuje tych operacji.

Jak wiemy, liczba całkowita w Pyton jest typ danych to reprezentuje liczbę całkowitą. W przeciwieństwie do list i słowników liczby całkowite nie przechowują sekwencji elementów i dlatego nie obsługują indeksowania ani dzielenia.
Na przykład, jeśli x = 42 (liczba całkowita) i próbujemy zrobić coś takiego jak x[0], jest to próba uzyskania dostępu do pierwszego elementu x tak, jakby x było lista lub krotka . Ponieważ liczby całkowite nie zawierają kolekcji elementów, ta operacja jest niepoprawna i pojawia się błąd TypeError: Obiekt „int” nie podlega indeksowaniu.

Przykład

Python3




# Example causing 'int' object is not subscriptable error> x> => 42> # Attempting to use subscript notation on an integer> print> (x[> 0> ])>

Wyjście:

Hangup (SIGHUP) Traceback (most recent call last):  File 'Solution.py', line 4, in   print(number[0]) TypeError: 'int' object is not subscriptable 

Dlaczego występuje błąd dotyczący obiektu „Int” nie podlegającego subskrypcji?

Obiekt „Int” nie jest indeksowalny. Błąd w Pythonie wynika ze specyficznych cech obiektów całkowitych (int). Oto powody wystąpienia tego błędu:

  • Niezmienność liczb całkowitych
  • Niezgodność typu zwracanej funkcji
  • Brak struktury iterowalnej

Niezmienność liczb całkowitych

Jak wiemy, liczby całkowite w Pythonie są niezmienne, co oznacza, że ​​ich wartości nie można zmienić po utworzeniu, a operacje indeksowania lub indeksowania mają zastosowanie do zmiennych sekwencji (np. list, smyczki ), gdzie można uzyskać dostęp do elementów lub je modyfikować za pomocą indeksów.

Ponieważ liczby całkowite nie są sekwencjami modyfikowalnymi, próba użycia nawiasów kwadratowych do indeksowania wyników w obiekcie „Int” nie jest błędem indeksowalnym.

Python3




# Example triggering 'Int' object is not subscriptable error> num> => 42> value> => num[> 0> ]> # Error: 'Int' object is not subscriptable>

Wyjście:

Hangup (SIGHUP) Traceback (most recent call last):  File 'Solution.py', line 3, in   value = num[0] # Error: 'Int' object is not subscriptable TypeError: 'int' object is not subscriptable 

Niezgodność typu zwracanej funkcji

Oczekuje się, że ta funkcja zwróci listę lub krotkę, gdy warunek ma wartość Fałsz, jak wskazano w gałęzi else.

Jednak w gałęzi else funkcja zwraca liczbę całkowitą zamiast listy lub krotki, co powoduje błąd „Int” Obiekt nie podlega indeksowaniu

Python3




def> get_data(condition):> > '''> > This function is expected to return a list or tuple,> > but under certain conditions, it returns an integer.> > '''> > if> condition:> > return> [> 1> ,> 2> ,> 3> ]> # Returns a list> > else> :> > return> 42> # Returns an integer> > # Function call with a condition that leads to an integer being returned> result> => get_data(> False> )> > # Attempting to index the result, which is an integer in this case> first_element> => result[> 0> ]>

Wyjście:

Hangup (SIGHUP) Traceback (most recent call last):  File 'Solution.py', line 15, in   first_element = result[0] TypeError: 'int' object is not subscriptable 

Brak struktury iterowalnej

Jak wiemy, liczbom całkowitym brakuje iterowalnej struktury wymaganej do indeksowania dolnego. Obiekty iterowalne, takie jak listy lub ciągi znaków, mają dobrze zdefiniowaną sekwencję elementów, do których można uzyskać dostęp za pomocą indeksów.

Próba użycia nawiasów kwadratowych w liczbie całkowitej oznacza traktowanie jej tak, jakby miała właściwości iterowalne, w wyniku czego obiekt „Int” nie jest błędem indeksowalnym.

Python3




# Example demonstrating misinterpretation of syntax> integer_value> => 123> value> => integer_value[> 0> ]>

Wyjście:

Hangup (SIGHUP) Traceback (most recent call last):  File 'Solution.py', line 3, in   value = integer_value[0] # Error: 'Int' object is not subscriptable TypeError: 'int' object is not subscriptable 

Rozwiąż obiekt „Int” nie podlega subskrypcji w Pythonie

  • Używaj ciągów lub list zamiast liczb całkowitych
  • Sprawdź typy zmiennych
  • Przejrzyj logikę kodu:

Przestudiujmy je szczegółowo

Używaj ciągów lub list zamiast liczb całkowitych

W Pythonie notacja z indeksem dolnym ma zastosowanie do ciągów i list. Możemy więc przekonwertować liczbę całkowitą na ciąg znaków lub listę przed użyciem notacji z indeksem dolnym.

Python3




# Converting integer to string and using subscript notation> number> => 42> number_str> => str> (number)> print> (number_str[> 0> ])>

Wyjście

4 

Sprawdź typy zmiennych

Musimy się upewnić, że zmienna, której używamy, jest oczekiwanego typu. Jeśli ma to być sekwencja (string lub lista), upewnij się, że nie przypisano jej omyłkowo wartości całkowitej.

Python3




# Checking variable type before using subscript notation> number> => 42> if> isinstance> (number, (> str> ,> list> )):> > print> (number[> 0> ])> else> :> > print> (> > f> 'Error: Variable type '{type(number).__name__}' is not subscriptable.'> )>

Wyjście

Error: Variable type 'int' is not subscriptable. 

Przejrzyj logikę kodu

Sprawdź logikę kodu, aby określić, czy notacja z indeksem dolnym jest naprawdę konieczna. Jeśli nie, popraw kod, aby uniknąć indeksowania liczb całkowitych.

Python3




# Reviewing code logic to avoid subscripting integers> number> => 42> number_str> => str> (number)> print> (number_str[> 0> ])>

Wyjście

4 

Wniosek

Z powyższych informacji możemy powiedzieć TypBłąd : Obiekt „int” nie podlega indeksowaniu. Błąd w Pythonie zwykle ma miejsce z powodu niezgodności typów, gdy liczba całkowita jest błędnie traktowana jako obiekt podlegający indeksowaniu, taki jak lista lub krotka. Aby temu zapobiec, ważne jest, aby konsekwentnie sprawdzać typy danych, szczególnie w przypadku dynamicznych lub złożonych struktur danych.