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

标签 python class debugging variables dictionary

<分区>

我正在编写一个程序来模拟由一排正方形组成的游戏板。在每个方 block 上,玩家掷一个 3 面骰子,骰子点数可能为 1、2 或 3。根据掷骰结果,玩家向前移动那么多格子。为了模拟这一点,每个方 block 都链接到其他 3 个方 block :它前面的一个,上面的一个,以及后面的一个。例如……

square 1: 
roll 1 -> square 2 ... 
roll 2 -> square 3 ...
roll 3 -> square 4

问题是,每当我为一个方 block 设置链接时,它也会为所有方 block 设置链接。换句话说,程序的行为就好像链接列表是一个全局变量而不是一个类变量。我对此感到非常困惑。

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

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()

我已经研究这个错误大约一个半小时了,我得出的结论是我遗漏了一些明显的东西,或者我不了解 Python 中的类变量。如果有任何帮助,我将不胜感激。

非常感谢!

最佳答案

links 好像是类变量,不是实例变量。您可以通过在 __init__() 中对其进行初始化来解决此问题:

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

关于python - Python 中的奇怪错误 - 变量被视为全局而不是本地,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29616605/

相关文章:

python - Scrapy LinkExtractor - 要遵循哪个 RegEx?

python - IPython 笔记本和 Pandas : How does pandas produce html table?

继承构造函数的 C++ 可见性

javascript - Nodejs 事件 - EventEmitter - 理解类实例

c# - Catching a vbscript error from c#(从c#执行的vbscriot)

python - 如何在python中捕获数量不足的参数错误

python - 为什么覆盖我的方法会导致我的属性停止正常工作?

php - 在 PHP 中包含问题

visual-studio-2010 - 调试器友好列表类

ios - Xcode如何调试发送到实例的无法识别的选择器