Python中的奇怪错误-变量被视为全局变量而不是局部变量

Python中的奇怪错误-变量被视为全局变量而不是局部变量,python,class,debugging,variables,dictionary,Python,Class,Debugging,Variables,Dictionary,我正在写一个程序,用来模拟由一排正方形组成的游戏板。在每个方块上,玩家滚动一个三面骰子,可以是1、2或3。根据掷骰,玩家向前移动了那么多空格。为了模拟这种情况,每个方块链接到另外3个方块:前面的一个,上面的一个,后面的一个。比如说 square 1: roll 1 -> square 2 ... roll 2 -> square 3 ... roll 3 -> square 4 问题是,每当我为一个正方形设置链接时,它也会为所有正方形设置链接。换句话说,程序的作用就像链接

我正在写一个程序,用来模拟由一排正方形组成的游戏板。在每个方块上,玩家滚动一个三面骰子,可以是1、2或3。根据掷骰,玩家向前移动了那么多空格。为了模拟这种情况,每个方块链接到另外3个方块:前面的一个,上面的一个,后面的一个。比如说

square 1: 
roll 1 -> square 2 ... 
roll 2 -> square 3 ...
roll 3 -> square 4
问题是,每当我为一个正方形设置链接时,它也会为所有正方形设置链接。换句话说,程序的作用就像链接列表是一个全局变量而不是类变量。我对此完全感到困惑

当我打印结果时,这就是我所期望的:

Square 1: 1 -> 2 ... 2 -> 3 ... 3 -> 4 
Square 2: 1 -> 3 ... 2 -> 4 ... 3 -> 5 
Square 3: 1 -> 4 ... 2 -> 5 ... 3 -> 6 
但事实上,我得到的是:

Square 1: 1 -> 2 ... 2 -> 3 ... 3 -> 4 
Square 2: 1 -> 2 ... 2 -> 3 ... 3 -> 4 
Square 3: 1 -> 2 ... 2 -> 3 ... 3 -> 4 
以下是总代码:

class Square:
    links = {}
    number = -1

    def __init__(self, num):
        self.number = num 

    def addLink(self, destination, distance):
        if(distance < 0 or distance > 3):
            print("ERROR: invalid distance " + str(distance) + " being linked from Square " + str(self.number) + " to " + str(destination.number))
            return;
        while(destination.hasJump()):
            destination = destination.getJumpDest()
        self.links[distance] = destination

    def getLink(self, n):
        return self.links[n]

    def hasJump(self):
        return 0 in self.links 

    def getJumpDest(self):
        return self.links[0]

    def printSummary(self):
        if(self.hasJump()):
            print("Square " + str(self.number) + ": 0 -> " + str(self.getJumpDest().number))
        else:
            print("Square " + str(self.number) + ":")
            if(1 in self.links):
                  print("1 -> " + str(self.getLink(1).number))
            if(2 in self.links):
                  print("2 -> " + str(self.getLink(2).number))
            if(3 in self.links):
                  print("3 -> " + str(self.getLink(3).number))

class Board:
    squares = {}
    size = 0

    def __init__(self, boardSize = 5):
        self.size = boardSize
        for n in range(boardSize, 0, -1):
            thisSquare = Square(n); 
            if(n < boardSize-1):            
               thisSquare.addLink(self.squares[(n+1)], 1)
            if(n < boardSize-2):
               thisSquare.addLink(self.squares[(n+2)], 2)
            if(n < boardSize-3):
               thisSquare.addLink(self.squares[(n+3)], 3)
            self.squares[n] = thisSquare

    def createJump(start, finish):
        self.squares[start].addLink(self.squares[finish],True)

game = Board()
for n in range(1,5):
    game.squares[n].printSummary()
class Square:
链接={}
数字=-1
定义初始化(self,num):
self.number=num
def addLink(自身、目的地、距离):
如果(距离<0或距离>3):
打印(“错误:从“+str(self.number)+”到“+str(destination.number)”的正方形链接的“+str(distance)+”无效)
返回;
while(destination.hasJump()):
destination=destination.getJumpDest()
self.links[距离]=目的地
def getLink(自身,n):
返回self.links[n]
def hasJump(自):
在self.links中返回0
def getJumpDest(自身):
返回self.links[0]
def打印摘要(自我):
如果(self.hasJump()):
打印(“方形”+str(self.number)+“:0->”+str(self.getJumpDest().number))
其他:
打印(“方形”+str(自身编号)+“:”)
如果(在self.links中为1):
打印(“1->”+str(self.getLink(1.number))
如果(在self.links中为2):
打印(“2->”+str(self.getLink(2.number))
如果(在self.links中为3):
打印(“3->”+str(self.getLink(3.number))
班级委员会:
平方={}
大小=0
def ___;初始(自身,boardSize=5):
self.size=boardSize
对于范围内的n(boardSize,0,-1):
此平方=平方(n);
如果(n
我研究这个bug已经有一个半小时了,我得出的结论是,要么我遗漏了一些明显的东西,要么我不了解Python中的类变量。我将非常感谢任何帮助


非常感谢你

链接
似乎是类变量,而不是实例变量。您可以通过在
\uuuu init\uuuu()中初始化它来修复此问题:

def __init__(self, num):
    self.number = num
    self.links = {}