web-dev-qa-db-ja.com

TypeError:ディクショナリにインデックスを付けるときに「type」オブジェクトに添え字を付けられません

ロードする必要のあるファイルが複数あるので、dictを使用して短くします。実行すると、

TypeError: 'type' object is not subscriptable 

エラー。これを機能させるにはどうすればよいですか?

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ヨネ

通常、変数が定義されていない場合、Python throws NameError

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

ただし、Pythonにすでに存在する名前につまずくことができました。

dictはPythonの組み込み型の名前 なので、奇妙なエラーメッセージのように見えますが、実際にはそうではありません。

dictのタイプはtypeです。すべてのタイプはPythonのオブジェクトです。したがって、実際にはtypeオブジェクトにインデックスを付けようとしています。これが、エラーメッセージに「 'type'オブジェクトは添字付け不可」と書かれている理由です。

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

dictの名前に盲目的に割り当てることはできますが、あなたは本当にそれをしたくないことに注意してください。後で問題が発生します。

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

問題の真の原因は、変数を使用する前に変数を割り当てる必要があることです。質問のステートメントを並べ替えるだけで、ほぼ確実に機能します。

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