Python中同一代码其他位置可运行却出现‘object not callable’错误
解决调用cell()时出现的'object not callable'错误
这个问题的根源其实很好找——你在CalculateNextGrid()函数的循环里,把循环变量的名字取成了cell,和你的类名重名了!
给你拆解一下逻辑:
- 你定义的
class cell:里,cell是指向这个类对象的引用; - 但在
for cell in grid:这行代码里,你把循环变量命名为cell,这就把原来指向类的cell引用,覆盖成了grid里的单个实例对象; - 所以当你在循环里尝试
cell(row, column, False)时,你其实是在试图调用一个已经实例化的对象,而不是调用类,这自然就会抛出'cell' object is not callable的错误。
修复步骤
- 修改循环变量名,把循环里的
cell改成别的名字,比如current_cell,避免和类名冲突:
def CalculateNextGrid(grid): output = [] index = 0 row = 0 column = 0 # 把循环变量从cell改成current_cell,避免覆盖类引用 for current_cell in grid: print(grid) neighbors = CountCells(index, grid, 20) if current_cell.state == True: if neighbors < 2 or neighbors > 3: # 现在可以正常调用cell类了 output.append(cell(row, column, False)) # 注意:这里的x/y未定义,换成row/column更合理 grid.append(cell(row, column, bool(random.getrandbits(1)))) else: # 补全生命游戏规则:存活细胞保留状态 output.append(cell(row, column, current_cell.state)) else: # 补全死亡细胞的规则:周围有3个存活则复活 if neighbors == 3: output.append(cell(row, column, True)) else: output.append(cell(row, column, current_cell.state)) # 更新坐标计数,避免所有新cell都用(0,0) index += 1 column += 1 if column >= 20: column = 0 row += 1
- 额外的小问题提醒:
- 你代码里的
grid.append(cell(x, y, ...))中的x和y没有在函数内定义,应该换成你正在使用的row和column; - 循环里的
row和column需要正确递增,不然所有新创建的cell都会用初始的(0,0)坐标,导致网格坐标混乱; - 原本的代码只处理了
cell.state == True的情况,别忘了补全死亡细胞的生命游戏规则逻辑。
- 你代码里的
为什么其他地方调用cell()正常?
因为在其他位置(比如创建grid的嵌套循环里),你没有用cell作为变量名,所以cell这个名字仍然指向你的类,自然可以正常实例化对象。
内容的提问来源于stack exchange,提问作者Aric
相关产品推荐
相关产品推荐

