“列表对象不可调用”Python E

2024-10-01 17:35:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在为一个Python图像库项目工作。但是,我无法理解为什么我总是得到一个“list not callable”错误:

def __computeTopColors(self):
    temp1, temp2, temp3, temp4 = [], [], [], []

    max = (0,0,0)
    for v in self.PixelVals: 
        if (v[0] > max[0]) and (v[1] > max[1]) and (v[2] > max[2]):
            max = v

    min = (1000,1000,1000)
    for v in self.PixelVals:
        if (v[0] < min[0]) and (v[1] < min[1]) and (v[2] < min[2]):
            min = v

    for pval in self.PixelVals:
        if (min[0] <= pval[0] <= int(((max[0])/2))) and (min[1] <= pval[1] <= int(((max[1])/2))):
            temp1.append(pval) 

    return temp1

def temp(self): 
    print self.temp

注意:这实际上是一节课的节选,但我不认为这是特别相关的。self.PixelVals是一个形式为(R,G,B)的列表元组。自身温度是我用来测试__computeTopColors方法的临时方法;我设置了自身温度等于__init__中的self.__computeTopColors。在

回溯:

^{pr2}$

第39行是代码块中的最后一行。在


Tags: andinselfforifdefmin温度
2条回答

我将代码粘贴到一个文件中,并添加以下内容:

>>> class Foo(object):
...    pass
>>> a = Foo()
>>> a.PixelVals = [(1,2,3),(4,5,6)]
>>> __computeTopColors(a)
[(1, 2, 3)]

所以这个代码没有问题。在

有一些文体问题,只是没有一个破坏了代码。例如:

  • 你不应该给你的变量命名,比如min和{},它们与内置函数的名称相同。在
  • 不要放太多除了让内容更难阅读之外没有任何功能的额外的paren-int(((max[1])/2))显然完全等同于{},但是要想清楚你是怎么做的,你需要几秒钟和一点思考,甚至还要花更长的时间来验证你做得是否正确(这一直是个问题,但尤其是当你要求其他人查看你的代码并猜测它可能有什么问题时)。在
  • 你应该用小写字母而不是CamelCase来命名像PixelVals这样的变量

所以很明显,出了什么问题都是在你代码的其他部分,你没有告诉我们。在

您添加了回溯的最后一行,并说它来自“我的代码块中的最后一行”。最后一行是:

^{pr2}$

错误会对此进行投诉:

a.temp()

很明显,你展示给我们的代码不是你正在运行的代码。但我可以从中猜出问题所在:

a可能是一个类变量或全局变量,其中包含一个list。你试图把它称为函数。所以Python非常明智地告诉您list对象是不可调用的。在

或者,还有一个猜测:

I set self.temp equal to self.__computeTopColors

好吧,这将用一个不同的变量替换方法temp。如前所述,它实际上会将方法temp替换为绑定方法__computeTopColors,这不能解决您所看到的问题(尽管这是一件非常奇怪和糟糕的事情)。但也许这不是真的,你实际上把self.temp设置为self.__computeTopColors(),这是调用绑定方法的结果。可能是个单子。所以现在,您还没有展示给我们的其他代码试图通过执行a.temp()来调用temp方法,因为您已经用list代替了可调用的temp方法,这就产生了相同的错误。在

事实上,即使您没有替换temp方法,它也不完全像定义的那样有用:

def temp(self): 
    print self.temp

除了您实现的绑定方法temp(例如,<bound method Foo.temp of <__main__.Foo object at 0x106d0f2d0>>)的表示之外,没有其他方法可以打印任何内容,这对您可能没有任何用处。在

不管是第一个问题,第二个问题,还是完全不同的问题,这一切都指向同一个更大的问题:不要给变量取任意、无意义的名称,如果你这样做了,要非常小心,不要在不同的地方重复使用相同的名称来表示不同的东西。如果幸运的话,您将混淆Python并得到一个错误。如果你运气不好,你只会混淆你自己和你代码的其他读者。在

您在某处用一个列表跟踪了int。别这样。并且停止跟踪min()max(),而你正在这样做。在

相关问题 更多 >

    热门问题