Pataisykite „Int“ objektą, kurio negalima prenumeruoti „Python“.

Šiame straipsnyje mes išnagrinėsime, kaip pataisyti „int“ objektą, kurio negalima prenumeruoti Python. Tačiau prieš tai išsiaiškinkime, kodėl taip atsitinka ir ką tai reiškia.

Kas yra „Int“ objektas nėra prenumeruojamas klaida?

Klaida „int“ objektas nėra prenumeruojamas įvyksta, kai bandote naudoti indeksavimą arba pjaustymą sveikasis skaičius , duomenų tipas, kuris nepalaiko šių operacijų.

Kaip žinome sveikasis skaičius in Python yra duomenų tipas kuris reiškia sveiką skaičių. Skirtingai nuo sąrašų ar žodynų, sveikieji skaičiai neturi elementų sekos, todėl nepalaiko indeksavimo ar pjaustymo.
Pavyzdžiui, jei x = 42 (sveikas skaičius), ir mes bandome daryti kažką panašaus į x[0], tai bandymas pasiekti pirmąjį x elementą taip, lyg x būtų sąrašą arba a kortele . Kadangi sveikieji skaičiai neapima elementų rinkinio, ši operacija negalioja ir gausite TypeError: objekto „int“ negalima prenumeruoti.

Pavyzdys

Python3




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

Išvestis:

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

Kodėl „Int“ objektas nėra prenumeruojamas klaida?

„Int“ objektas nėra prenumeruojamas Python klaida, atsiranda dėl specifinių sveikųjų skaičių (int) objektų savybių. Štai šios klaidos priežastys:

  • Sveikųjų skaičių nekintamumas
  • Funkcijos grąžinimo tipo neatitikimas
  • Nėra kartojamos struktūros

Sveikųjų skaičių nekintamumas

Kaip žinome, sveikieji skaičiai Python yra nekintantys, o tai reiškia, kad jų reikšmės negali būti keičiamos sukūrus, o prenumeratos arba indeksavimo operacijos yra taikomos kintamoms sekoms (pvz., sąrašams, stygos ), kur elementus galima pasiekti arba modifikuoti naudojant indeksus.

Kadangi sveikieji skaičiai nėra kintamos sekos, bandymas naudoti laužtinius skliaustus rezultatams „Int“ prenumeruoti nėra registruojama klaida.

Python3




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

Išvestis:

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 

Funkcijos grąžinimo tipo neatitikimas

Tikimasi, kad šioje funkcijoje bus pateiktas sąrašas arba eilutė, kai sąlyga yra klaidinga, kaip nurodo šaka else.

Tačiau kitoje šakoje funkcija grąžina sveikąjį skaičių, o ne sąrašą arba eilutę, dėl kurios atsiranda klaida „Int“ objektas nėra prenumeruojamas

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> ]>

Išvestis:

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

Nėra kartojamos struktūros

Kaip žinome, sveikiesiems skaičiams trūksta kartojamos struktūros, reikalingos prenumeravimui. Iteruojami objektai, tokie kaip sąrašai ar eilutės, turi tiksliai apibrėžtą elementų seką, kurią galima pasiekti naudojant indeksus.

Bandymas naudoti laužtinius skliaustus sveikajame skaičiuje reiškia, kad jis turi pasikartojamų savybių, todėl objektas „Int“ nėra registruojama klaida.

Python3




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

Išvestis:

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 

Išspręskite „Int“ objektą, kurio negalima prenumeruoti Python

  • Vietoj sveikųjų skaičių naudokite eilutes arba sąrašus
  • Patikrinkite kintamųjų tipus
  • Peržiūrėkite kodo logiką:

Panagrinėkime juos išsamiai

Vietoj sveikųjų skaičių naudokite eilutes arba sąrašus

Python programoje apatinio indekso žymėjimas taikomas eilutėms ir sąrašams. Taigi, prieš naudodami indekso žymėjimą, galime konvertuoti sveikąjį skaičių į eilutę arba sąrašą.

Python3




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

Išvestis

4 

Patikrinkite kintamųjų tipus

Turime įsitikinti, kad mūsų naudojamas kintamasis yra tokio tipo, kokio norime. Jei tai turėtų būti seka (eilutė arba sąrašas), įsitikinkite, kad jai netyčia priskirta sveikojo skaičiaus reikšmė.

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.'> )>

Išvestis

Error: Variable type 'int' is not subscriptable. 

Peržiūrėkite kodo logiką

Išnagrinėkite savo kodo logiką, kad nustatytumėte, ar indekso žymėjimas tikrai reikalingas. Jei ne, peržiūrėkite kodą, kad išvengtumėte sveikųjų skaičių.

Python3




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

Išvestis

4 

Išvada

Iš aukščiau pateiktos informacijos galime pasakyti Tipo klaida : „int“ objektas nėra subnumeruojamas „Python“ klaida, paprastai įvyksta dėl tipo neatitikimo, kai sveikas skaičius klaidingai traktuojamas kaip subscriptuojamas objektas, pvz., sąrašas arba eilutė. Taigi, norint to išvengti, labai svarbu nuosekliai tikrinti duomenų tipus, ypač kai kalbama apie dinamines ar sudėtingas duomenų struktūras.