【问题标题】:'tuple' not callable error“元组”不可调用错误
【发布时间】:2014-05-27 06:29:56
【问题描述】:

我现在这个问题已经被问过好几次了。但是,答案似乎无法解决我的问题。 我收到一个类型错误,“元组”对象不可调用。即使列表中的元组以正确的方式用逗号分隔,我也得到了这个:

def aiMove(b):
    movesList = moves(b, -1)
    heuristic = []
    if movesList:
        for m in movesList:
            bt = copy.deepcopy(b)
            print("bt: ", bt)
            bt[m[0]][m[1]] = -1         
            h = heat[m[0]][m[1]]
            for move in m[2]:
                i=1;
                try:
                    while (-1* bt[m[0] + i*move[0]][m[1] + i*move[1]] < 0):
                        bt[m[0] + i*move[0]][m[1] + i*move[1]] *= -1    
                        bt[m[0] + i*move[0]][m[1] + i*move[1]] += -1    
                        i += 1;
                except IndexError:
                    continue

            alpha = max(float('-inf'), alphabeta(bt, depth-1, h, float('-inf'), float('inf'), 1))
            heuristic.append(alpha)
            if (float('inf') <= alpha):
                break
            selectedMove = movesList[int(heuristic.index(max(heuristic)))]
            move(b, selectedMove, -1)
    else:
        print ("The AI can't move!")
            return []

selectedMove 是 (3, 2, [(0 , 1)]) 例如。 move() 函数返回一个移动列表,例如 selectedMove 的最终值。它是用于游戏树搜索的 alpha beta 修剪实现。 move() 函数实际上将棋子移动到该位置并更新棋盘以完成计算机的轮到。 变量 b 表示当前游戏板上的值 我尝试的每次转换(即强制 selectedMove 本身是一个列表等)都会在“move(b,selectedMove,-1)”行中给出相同的错误

有人知道可能出了什么问题吗?

Microsoft Windows [Version 6.1.7600]  
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.
Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python33\lib\tkinter\__init__.py", line 1489, in __call__
    return self.func(*args)
  File "C:\Users\Loek Janssen\Documents\GitHub\CITS1401-Project\DrawBoard.py", line 131, in eventfun
    placePiece(x, y, b, n)
  File "C:\Users\Loek Janssen\Documents\GitHub\CITS1401-Project\DrawBoard.py", line 119, in placePiece
        project2.aiMove(b)
  File "C:\Users\Loek Janssen\Documents\GitHub\CITS1401-Project\project2.py", line 225, in aiMove
    move(b, selectedMove, -1)
TypeError: 'tuple' object is not callable

【问题讨论】:

  • 本质上这意味着元组不是函数。您可能在move 函数中的某处调用selectedMove,例如selectedMove(args)
  • 没有看到您的完整回溯,我们在黑暗中拍摄,但此类错误的一个非常常见的来源是重新分配内置函数的名称,例如 max 来引用函数以外的东西(在这种情况下是元组)。我会检查你的代码以确保你永远不会做任何类似max = (0, 1) 或类似的事情。

标签: python tuples typeerror


【解决方案1】:

在这一行中,您说您将使用名称 move 来引用 m[2] 的元素:

for move in m[2]:

但是稍后,您尝试调用一个 函数,而您已经调用了 move

move(b, selectedMove, -1)

一旦你看到这个,错误信息就完全有意义了:

TypeError: 'tuple' object is not callable

因为名称 move 不再指代函数,而是指在循环中绑定的最后一个元组。

比修复这个特定错误(如果您还想使用它来引用函数,请不要使用move 作为变量名)更重要的是识别解释器如何准确地告诉您问题所在。

它说一个元组是不可调用的;在它抱怨的代码行中,您调用的是move;因此move 是一个元组,你的下一步应该是添加print(move)(或者print(type(move), repr(move)),如果你想花哨的话)看看它实际上是什么元组。

【讨论】:

    猜你喜欢
    • 2014-09-27
    • 2017-11-17
    • 1970-01-01
    • 2018-11-10
    • 1970-01-01
    • 2012-08-08
    • 2020-08-29
    • 2021-09-30
    • 1970-01-01
    相关资源
    最近更新 更多