TypeError: ‘int’-object ondersteunt geen itemtoewijzing

Ik krijg deze fout en weet niet hoe ik deze moet oplossen…

Temp[i]=T*(p[i]/po)**rp
TypeError: 'int' object does not support item assignment

Antwoord 1, autoriteit 100%

U probeert hier vermoedelijk een lijst met lengtes lenpop te bouwen. U moet hier een lijst maken door vermenigvuldiging:

Temp = [None] * lenp

maar u kunt beter de lijst samenstellen door eraan toe te voegen:

Temp = []
for i in p:
    Temp.append(T * (i / po) ** rp)

waar je p[i]niet gebruikt maar irechtstreeks; Python forloops zijn eigenlijk for eachloops.

Uw range()produceert waarden in de reeks [0, 10, 20, ... 1200)en de forlus wijst elk van die waarden naar iper iteratie. Als je iweer gebruikt om in pte indexeren, zou je problemen krijgen; p[0]zou nog steeds 0zijn, maar p[10]zou dan 100zijn, p[20]is 200, enz. totdat p[120]een IndexErrorgenereert omdat er slechts 119 verschillende waarden in dat bereik.

Je kunt de for-lus die wordt toegevoegd aan Tempsamenvouwen tot een lijstbegrip om de lijst in één keer op te bouwen:

rp=1.331
po=1000
T=280
Temp = [T * (i / po) ** rp for i in range(0, 1200, 10)]

Antwoord 2, autoriteit 75%

Er zijn een aantal problemen met uw code.

De meest directe is dat uw Temp-waarde geen reeks is waaraan u dingen kunt toewijzen, maar slechts een geheel getal (de haakjes doen niets). Hoewel je er een tuple van zou kunnen maken door een komma toe te voegen, kun je nog steeds geen waarden toewijzen aan Tempnadat het is gemaakt (tupels zijn onveranderlijk). In plaats daarvan wil je waarschijnlijk een lijst.

Er is echter een ander probleem met uw lus. Een for-lus zoals for value in sequencewijst waarden uit de sequencetoe aan de variabele value. Het wijst geen indexen toe! Als je indexen nodig hebt, kun je ofwel enumerategebruiken of een andere looping-constructie gebruiken, zoals een lijstbegrip.

Hier is een minimaal gewijzigde versie van uw code die eerst een lijst met lenpnullen maakt en vervolgens hun waarden vervangt door de berekende:

p=range(0,1200,10)
lenp=len(p)
rp=1.331
po=1000
T=280
Temp=[0]*lenp
for i, p_value in enumerate(p):
    Temp[i]=T*(p_value/po)**rp
print T

Hier is een meer pythonische versie die een lijstbegrip gebruikt in plaats van een gewone lus:

rp=1.331
po=1000
T=280
Temp = [T*(p_value/po)**rp for p_value in range(0,1200,10)]

Antwoord 3, autoriteit 25%

Uw Tempis geen tuple, het is gewoon een geheel getal tussen haakjes. Je kunt dit oplossen met een simpele ,. Overweeg het volgende:

>>> x = (42)  # not a tuple
>>> x[0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'int' object has no attribute '__getitem__'
>>> 
>>> x = (42,)  # tuple
>>> x[0]
42

Tuples zijn echter onveranderlijken u kunt een dergelijke opdracht niet uitvoeren:

>>> x[0] = 0
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment

Je kunt dit probleem oplossen door in plaats daarvan een lijst te gebruiken.


Antwoord 4, autoriteit 25%

De fout is dat wanneer we een (getal) toekennen aan x, dit is wat er feitelijk gebeurt,

>>> x = (50)
>>> x
50

Dus als je een lege lijst wilt maken, kun je dat op deze manier doen

rows = 5
cols = 3
matrix = [[0 for c in range(cols)] for r in range(rows)]

Het gaat zoiets maken,

>>> matrix
[[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]

Other episodes