3

我正在开发一个 Python 图像库项目以获取乐趣。但是,我无法弄清楚为什么我不断收到此代码的“列表不可调用”错误:

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) 形式的列表元组。self.temp 是我用来测试该方法的临时__computeTopColors方法;我设置 self.temp 等于self.__computeTopColorsin __init__

回溯:

Traceback (most recent call last):
  File "fiveColors.py", line 39, in <module>
    a.temp()

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

4

2 回答 2

6

你已经在int某个地方留下了一份清单。别那样做。并停止阴影min()max()当你在它的时候。

于 2012-12-19T00:50:19.743 回答
2

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

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

所以这段代码没有任何问题。

从头开始 - 存在风格问题,只是没有一个会破坏代码。例如:

  • 你永远不应该给你的变量命名,就像minmax内置函数的名字一样。
  • 不要放入大量额外的括号,除了使事情更难阅读之外没有任何功能 - <code>int(((max[1])/2)) 显然完全等同于int(b[1]/2),但它需要几秒钟并且想一想看看你在做什么,甚至更长的时间来验证你做的是否正确(这总是一个问题,但尤其是当你要求其他人查看你的代码并猜测可能会发生什么时错了)。
  • 您应该PixelVals使用小写而不是 CamelCase 等命名变量。

很明显,无论您的代码的其他部分有什么问题,您都没有向我们展示。

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

print self.temp

该错误抱怨这一点:

a.temp()

显然,您向我们展示的代码不是您正在运行的代码。但我可以从这个问题上猜测:

a可能是一个类变量或全局变量,其中包含一个list. 您试图将其称为函数。因此,Python 非常明智地告诉您列表对象是不可调用的。

或者,这是另一个猜测:

我设置 self.temp 等于 self.__computeTopColors

好吧,这将temp用不同的变量替换方法。正如所写的那样,它实际上会temp用绑定的方法替换方法__computeTopColors,这不能解决您所看到的问题(尽管这是一件非常奇怪和糟糕的事情)。但也许这实际上不是真的,您实际上设置self.temp了 equal to self.__computeTopColors()调用该绑定方法的结果。这可能是一个列表。因此,现在,您尚未向我们展示的其他一些代码尝试temp通过做来调用该方法a.temp(),并且因为您已将该temp方法替换为 alist而不是可调用的东西,所以会引发相同的错误。

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

def temp(self): 
    print self.temp

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

无论是第一个问题、第二个问题,还是完全不同的问题,这都指向同一个更大的问题:不要给变量指定任意、无意义的名称——如果这样做,要非常小心,不要重复使用相同的名称在不同的地方有不同的意思。如果你很幸运,你会混淆 Python 并得到一个错误。如果你不走运,你只会让你自己和你的代码的其他读者感到困惑。

于 2012-12-19T01:09:04.023 回答