tuple'不可调用错误

3 投票
1 回答
32650 浏览
提问于 2025-04-18 07:40

我知道这个问题已经被问过好几次了。不过,之前的回答似乎没有解决我的问题。 我遇到了一个类型错误,提示说'tuple'对象不可调用。即使我在列表中的元组用逗号正确分隔,我还是会遇到这个错误。

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)])。moves()函数返回一个像selectedMove最终值那样的移动列表。这个函数是用来在游戏树搜索中实现一种叫做“阿尔法-贝塔剪枝”的算法。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

1 个回答

9

在这一行,你说你要用名字 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)))来看看它到底是什么元组。

撰写回答