python-3.x TypeError:在字典中建立索引时,'type'对象不是可订阅的

9w11ddsr  于 2022-11-19  发布在  Python
关注(0)|答案(3)|浏览(190)

我需要加载多个文件,所以我使用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))
dgenwo3n

dgenwo3n1#

通常,如果变量没有定义,Python会抛出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))
pjngdqdw

pjngdqdw2#

您应该更新到python >= 3.9,这样一切都会正常工作

ruarlubt

ruarlubt3#

当我偶然发现这个错误时,我有这个函数:

def trainByDistribution(xs: pd.DataFrame, ys: pd.DataFrame, step) -> tuple[float]:

我的想法是创建一个函数,它接受两个Pandas Dataframe 和一个整数,并返回一个浮点数元组。
就像其他答案所陈述的那样,在Python中,一切都是对象,甚至类本身也是对象。类反过来是蓝图对象,可以用来生成新对象,因此类可以被赋给变量,作为参数传递,并通过type()函数编程构造。

class Person(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def __str__(self):
        return str(name) + str(age)

这个类别相当于:

def __init__(self, name, age):
    self.age = age
    self.name = name
def  __str__(self):
     return str(name) + str(age)
Person = type("Person, ("object",), {"__init__": __init__,
            "__str__": __str__})

当你传递给一个函数一个不支持通过索引访问值的对象(不重载[]运算符)时,会出现“object is not subscriptable”错误。由于所有类的类型都是<class "type">

>>> type(Person)
<class "type">

那么type object is not subscriptable意味着你传递的是class而不是一个实际的对象。这可能会更棘手,在我上面的函数中,我传递了有效的 Dataframe ,并且我的错误出现了,因为我试图将返回类型注解为tuple[float],虽然这个语法在我看来应该是法律的的,但解释器理解这个表达式就好像我想索引元组类本身一样。

结论

出现此错误的原因:

  • 向函数参数传递类而不是实际对象;
  • 您可以使用类名来索引任何内容,包括使用类名命名变量。

您可以查看此tutorial by mCoding,以了解有关作为对象的类的更多信息。

相关问题