web-dev-qa-db-fra.com

TypeError: l'objet 'type' n'est pas indexable lors de l'indexation dans un dictionnaire

J'ai plusieurs fichiers à charger, donc j'utilise un dict pour raccourcir les choses. Quand je cours, je reçois un

TypeError: 'type' object is not subscriptable 

Erreur. Comment puis-je faire en sorte que cela fonctionne?

m1 = pygame.image.load(dict[1])
m2 = pygame.image.load(dict[2])
m3 = pygame.image.load(dict[3])
dict = {1: "walk1.png", 2: "walk2.png", 3: "walk3.png"}
playerxy = (375,130)
window.blit(m1, (playerxy))
13
Chanヨネ

Normalement Python lance NameError si la variable n'est pas définie:

>>> d[0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'd' is not defined

Cependant, vous avez réussi à tomber sur un nom qui existe déjà en Python.

Parce que dict est le nom d'un type intégré en Python vous voyez ce qui semble être un étrange message d'erreur, mais en réalité ce n'est pas le cas.

Le type de dict est un type. Tous les types sont des objets en Python. Ainsi, vous essayez en fait d'indexer dans l'objet type. C'est pourquoi le message d'erreur indique que "l'objet" type "n'est pas indexable."

>>> type(dict)
<type 'type'>
>>> dict[0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'type' object is not subscriptable

Notez que vous pouvez affecter aveuglément le nom dict, mais vous ne voulez vraiment pas faire cela. Cela va juste provoquer vous problèmes plus tard.

>>> dict = {1:'a'}
>>> type(dict)
<class 'dict'>
>>> dict[1]
'a'

La véritable source du problème est que vous devez affecter des variables avant d'essayer de les utiliser. Si vous réorganisez simplement les énoncés de votre question, cela fonctionnera presque certainement:

d = {1: "walk1.png", 2: "walk2.png", 3: "walk3.png"}
m1 = pygame.image.load(d[1])
m2 = pygame.image.load(d[2])
m3 = pygame.image.load(d[3])
playerxy = (375,130)
window.blit(m1, (playerxy))
22
b4hand