【问题标题】:"List object is not callable" Python Error“列表对象不可调用”Python 错误
【发布时间】:2012-12-06 07:19:39
【问题描述】:

我正在开发一个 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 方法的临时方法;我在__init__ 中设置self.temp 等于self.__computeTopColors

回溯:

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

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

【问题讨论】:

  • 你能发布完整的回溯吗?
  • 至少告诉我们哪一行引发了异常,否则我们必须逐行检查您的代码,试图猜测哪一行可能是错误的。
  • 此外,它是类的一部分这一事实可能不相关,但您可以将其提取到可以自行运行的东西中,并给我们Short, Self Contained, Correct Example
  • 该回溯中的代码似乎不是您向我们展示的任何代码。你说“是我代码块中的最后一行”,但最后一行是print self.temp,显然和a.temp()不一样。
  • @xetur:当你在做的时候,为什么不给我们一个实际的可运行示例,它会产生你希望我们调试的错误,而不是给我们随机的不相关代码,让我们尝试猜猜你的其余代码可能有什么问题?

标签: python list call


【解决方案1】:

您已在某处使用列表跟踪 int。别那样做。并在您使用时停止跟踪 min()max()

【讨论】:

  • 您好,我是 Python 的 OOP 新手,您能详细说明一下吗?我究竟应该怎么做?
  • @xetur:这与 OOP 无关,甚至与 Python 无关。如果你命名一个变量int,它会替换int的内置定义,这意味着你不能再调用内置函数。 minmax 也是如此。
  • 这是一个很好的猜测,考虑到 int 是他给我们的函数中唯一的函数调用......但看起来错误不是来自那个函数,所以隐藏 int不是问题。 (嗯,大概……很难说……)
【解决方案2】:

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

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

所以这段代码没有问题。

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

  • 您决不能为变量命名,例如 minmax,它们与内置函数的名称相同。
  • 不要添加大量额外的括号,这些括号除了使内容更难阅读之外没有任何功能——int(((max[1])/2)) 显然完全等同于 int(b[1]/2),但需要几秒钟和一些思考才能看到什么您正在这样做,甚至更长的时间来验证您是否正确执行(这总是一个问题,但尤其是当您要求其他人查看您的代码并猜测它可能有什么问题时)。
  • 您应该用小写而不是 CamelCase 等命名变量,例如 PixelVals

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

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

print self.temp

错误抱怨这个:

a.temp()

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

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

或者,这是另一个猜测:

我设置 self.temp 等于 self.__computeTopColors

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

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

def temp(self): 
    print self.temp

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

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

【讨论】:

    猜你喜欢
    • 2017-02-19
    • 2017-11-15
    • 1970-01-01
    • 1970-01-01
    • 2012-05-07
    • 1970-01-01
    • 2021-02-16
    • 2016-09-02
    • 1970-01-01
    相关资源
    最近更新 更多